@esfaenza/text-editors 20.3.25 → 20.3.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1 +1,122 @@
1
- # Text Editors
1
+ # Text Editors
2
+
3
+ Libreria che rende disponibile `<es-editor>`, un editor rich-text basato su [tiptap](https://tiptap.dev)
4
+ che produce il proprio valore in HTML, Markdown o testo semplice.
5
+
6
+ ## Installazione
7
+
8
+ ```
9
+ npm install @esfaenza/text-editors
10
+ ```
11
+
12
+ Dipendenze: i pacchetti `@tiptap/*` (versione `3.17.1`), `@floating-ui/dom` e `marked` sono `peerDependencies`
13
+ a versione fissa: vedere `package.json` per l'elenco completo e installarli alle stesse versioni.
14
+
15
+ ## Setup
16
+
17
+ Il componente è **standalone**: non c'è un modulo da configurare, basta importarlo dove serve.
18
+
19
+ ```typescript
20
+ import { EditorComponent } from "@esfaenza/text-editors";
21
+
22
+ @Component({
23
+ ...,
24
+ imports: [FormsModule, EditorComponent]
25
+ })
26
+ export class MyComponent { }
27
+ ```
28
+
29
+ In un modulo non standalone si aggiunge `EditorComponent` agli `imports` del modulo.
30
+
31
+ ## Utilizzo
32
+
33
+ Il componente è un `ControlValueAccessor`: il valore si legge e si scrive tramite `ngModel` o un form reattivo.
34
+
35
+ ```html
36
+ <es-editor Mode="html" name="body" [(ngModel)]="model.body"
37
+ [BulletListSupport]="true" [TablesSupport]="true"></es-editor>
38
+
39
+ <es-editor Mode="markdown" name="note" [(ngModel)]="model.note"
40
+ [MentionEntities]="users"></es-editor>
41
+
42
+ <es-editor readonly Mode="html" name="preview" [(ngModel)]="model.body"></es-editor>
43
+ ```
44
+
45
+ ### Input
46
+
47
+ | Input | Tipo | Default | Descrizione |
48
+ |---|---|---|---|
49
+ | `Mode` | `'html' \| 'markdown' \| 'text'` | — (obbligatorio) | Formato del valore prodotto e accettato dall'editor |
50
+ | `name` | `string` | — (obbligatorio) | Nome del controllo |
51
+ | `readonly` | `boolean` | `false` | Nasconde la toolbar e rende il contenuto non modificabile |
52
+ | `BulletListSupport` | `boolean` | `false` | Mostra il pulsante per gli elenchi puntati |
53
+ | `TablesSupport` | `boolean` | `false` | Abilita le tabelle e i relativi pulsanti (solo con `Mode="html"`) |
54
+ | `EmojiSupport` | `boolean` | `false` | Mostra il selettore di emoji |
55
+ | `MentionEntities` | `{ id: string, description: string }[]` | `[]` | Se valorizzato abilita le menzioni con `@` |
56
+ | `style` | `string` | `""` | Stile inline applicato al contenitore dell'editor |
57
+
58
+ `Mode`, `readonly`, `TablesSupport` e `MentionEntities` vengono letti **una sola volta**, all'inizializzazione
59
+ del componente: cambiarli in seguito non riconfigura l'editor. Per cambiarli va ricreato il componente
60
+ (ad esempio con un `@if`).
61
+
62
+ Gli input `disabled` e `required` e gli output `inputChange`, `inputFocus` e `inputFinalized` sono dichiarati
63
+ ma al momento non hanno alcun effetto.
64
+
65
+ ### Comportamento come controllo di form
66
+
67
+ - Il caricamento di un valore (da `ngModel` o da `setValue`/`patchValue`) **non** emette un cambio di valore:
68
+ il controllo resta `pristine` finché l'utente non modifica il contenuto. Di conseguenza il valore nel modello
69
+ resta quello caricato (ad esempio senza la rimozione del prefisso descritta sotto) fino alla prima modifica.
70
+ - Il controllo diventa `touched` quando l'editor perde il focus.
71
+
72
+ ### Modalità
73
+
74
+ - **`html`**: il valore è l'HTML generato dall'editor. Un editor vuoto produce `""` (non `<p></p>`).
75
+ La toolbar include la scelta del **carattere** (font "web safe": Arial, Verdana, Tahoma, Trebuchet MS,
76
+ Georgia, Times New Roman, Courier New) e della **dimensione** (da 10px a 32px), salvati come
77
+ `<span style="font-family: …; font-size: …">`. L'opzione vuota ("Carattere" / "Dimensione") rimuove lo stile.
78
+ Carattere e dimensione presenti nell'HTML caricato o incollato vengono mantenuti (i `pt` vengono convertiti in `px`).
79
+ - **`markdown`**: il valore è Markdown. Le immagini con larghezza o allineamento personalizzati vengono
80
+ salvate come tag `<img>` HTML all'interno del Markdown. Carattere, dimensione e colore del testo non sono
81
+ rappresentabili in Markdown: la toolbar non li offre e, se presenti nel testo incollato, vanno persi al salvataggio.
82
+ - **`text`**: il valore è il solo testo, senza formattazione.
83
+
84
+ Un valore `null` o `undefined` in ingresso viene trattato come stringa vuota. Un eventuale prefisso iniziale
85
+ `****** ` o `** ` viene rimosso.
86
+
87
+ ### Menzioni
88
+
89
+ Con `MentionEntities` valorizzato, digitando `@` compare un elenco (massimo 5 voci) filtrato per inizio della
90
+ `description`; si naviga con le frecce e si conferma con Invio o con un click.
91
+
92
+ In Markdown una menzione viene salvata come `@<id>` e riconosciuta in rilettura **solo se l'`id` è composto
93
+ da esattamente 7 lettere** (come i codici utente, ad es. `@GHETTIE`). Menzioni con id diversi non
94
+ sopravvivono a un salvataggio e successivo caricamento in Markdown.
95
+
96
+ ### Immagini
97
+
98
+ Le immagini incollate o trascinate nell'editor vengono **incorporate nel valore come data URI base64**:
99
+ tenerne conto per la dimensione dei dati salvati. Una volta inserita, un'immagine può essere ridimensionata
100
+ con la maniglia e allineata a sinistra, al centro o a destra.
101
+
102
+ ### Stili
103
+
104
+ Il componente usa `ViewEncapsulation.None`: le sue regole CSS (`.editor-shell`, `.editor-toolbar`,
105
+ `.ProseMirror`, `.suggestion-popup`, …) sono globali e possono essere sovrascritte dall'applicazione
106
+ che lo ospita.
107
+
108
+ I colori della toolbar e dei controlli sulle immagini passano da custom property definite su `.editor-shell`,
109
+ sovrascrivibili senza toccare le regole:
110
+
111
+ ```css
112
+ es-editor .editor-shell {
113
+ --es-editor-border: #e2e4e9; /* bordi, divisori */
114
+ --es-editor-toolbar-bg: #fafbfc; /* sfondo della toolbar */
115
+ --es-editor-text: #1f2328;
116
+ --es-editor-icon: #4b5563; /* icone dei pulsanti */
117
+ --es-editor-hover: #eef0f3; /* sfondo al passaggio del mouse */
118
+ --es-editor-accent: #2342c0; /* pulsante attivo, focus, selezione immagine */
119
+ --es-editor-accent-soft: #e5ebff; /* sfondo del pulsante attivo */
120
+ --es-editor-focus: rgba(35, 66, 192, 0.28);
121
+ }
122
+ ```
@@ -1,6 +1,6 @@
1
1
  import { CommonModule } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { viewChild, input, booleanAttribute, EventEmitter, forwardRef, Output, ViewEncapsulation, Component, InjectionToken } from '@angular/core';
3
+ import { viewChild, input, booleanAttribute, signal, EventEmitter, forwardRef, HostListener, Output, ViewEncapsulation, Component, InjectionToken } from '@angular/core';
4
4
  import * as i1 from '@angular/forms';
5
5
  import { FormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
6
6
  import { Extension, Editor } from '@tiptap/core';
@@ -163,7 +163,8 @@ const CustomImageWithView = CustomImage.extend({
163
163
  let updateWrapper = (wrapper, node) => {
164
164
  wrapper.draggable = true;
165
165
  wrapper.contentEditable = "false";
166
- wrapper.className = `img-wrapper`;
166
+ // classList e non className: non deve cancellare "ProseMirror-selectednode" messa da ProseMirror sull'immagine selezionata
167
+ wrapper.classList.add(`img-wrapper`);
167
168
  wrapper.style.float = node.attrs.float;
168
169
  if (node.attrs.float === 'left' || node.attrs.float === 'right') {
169
170
  wrapper.style.width = "auto";
@@ -180,17 +181,35 @@ const CustomImageWithView = CustomImage.extend({
180
181
  updateImage(img, node);
181
182
  const toolbar = document.createElement('div');
182
183
  toolbar.className = `img-toolbar ${editor.isEditable ? '' : 'readonly'}`;
183
- const btn = (t, fn) => {
184
+ const btn = (title, icon, fn) => {
184
185
  const b = document.createElement('button');
185
186
  b.type = "button";
186
- b.textContent = t;
187
+ b.title = title;
188
+ b.setAttribute("aria-label", title);
189
+ b.innerHTML = `<svg viewBox="0 0 24 24" aria-hidden="true"><path d="${icon}" /></svg>`;
187
190
  b.onclick = fn;
188
191
  return b;
189
192
  };
190
- toolbar.append(btn('Centro', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos(), undefined, { ...node.attrs, ...{ float: 'none' } }))), btn('Sinistra', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos(), undefined, { ...node.attrs, ...{ float: 'left' } }))), btn('Destra', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos(), undefined, { ...node.attrs, ...{ float: 'right' } }))), btn('Elimina', () => {
193
+ const setFloat = (float) => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos(), undefined, { ...node.attrs, ...{ float } }));
194
+ // Pulsanti di allineamento, indicizzati per valore di "float" per evidenziare quello attivo
195
+ const alignButtons = {
196
+ left: btn('Allinea a sinistra', 'M15 12H3M17 18H3M21 6H3', () => setFloat('left')),
197
+ none: btn('Centra', 'M17 12H7M19 18H5M21 6H3', () => setFloat('none')),
198
+ right: btn('Allinea a destra', 'M21 12H9M21 18H7M21 6H3', () => setFloat('right')),
199
+ };
200
+ const separator = document.createElement('span');
201
+ separator.className = 'img-toolbar-divider';
202
+ const deleteButton = btn('Elimina immagine', 'M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M10 11v6M14 11v6', () => {
191
203
  const nodePos = getPos();
192
204
  editor.view.dispatch(editor.view.state.tr.delete(nodePos, nodePos + node.nodeSize));
193
- }));
205
+ });
206
+ deleteButton.classList.add('danger');
207
+ toolbar.append(alignButtons['left'], alignButtons['none'], alignButtons['right'], separator, deleteButton);
208
+ const updateToolbar = (node) => {
209
+ const float = node.attrs.float === 'left' || node.attrs.float === 'right' ? node.attrs.float : 'none';
210
+ Object.entries(alignButtons).forEach(([key, b]) => b.classList.toggle('is-active', key === float));
211
+ };
212
+ updateToolbar(node);
194
213
  // resize
195
214
  let startX = 0;
196
215
  let startW = 0;
@@ -232,6 +251,7 @@ const CustomImageWithView = CustomImage.extend({
232
251
  node = updatedNode;
233
252
  updateImage(img, node);
234
253
  updateWrapper(wrapper, node);
254
+ updateToolbar(node);
235
255
  return true;
236
256
  },
237
257
  };
@@ -416,9 +436,32 @@ class EditorComponent {
416
436
  this.style = input("", ...(ngDevMode ? [{ debugName: "style" }] : []));
417
437
  this.MentionEntities = input([], ...(ngDevMode ? [{ debugName: "MentionEntities" }] : []));
418
438
  this.name = input.required(...(ngDevMode ? [{ debugName: "name" }] : []));
439
+ // Font disponibili nella toolbar (solo html): font "web safe", perché il valore viene visualizzato anche fuori dall'editor
440
+ this.FontFamilies = [
441
+ { label: "Arial", value: "Arial, Helvetica, sans-serif" },
442
+ { label: "Verdana", value: "Verdana, Geneva, sans-serif" },
443
+ { label: "Tahoma", value: "Tahoma, Geneva, sans-serif" },
444
+ { label: "Trebuchet MS", value: "'Trebuchet MS', Helvetica, sans-serif" },
445
+ { label: "Georgia", value: "Georgia, serif" },
446
+ { label: "Times New Roman", value: "'Times New Roman', Times, serif" },
447
+ { label: "Courier New", value: "'Courier New', Courier, monospace" },
448
+ ];
449
+ this.FontSizes = ["10px", "12px", "14px", "16px", "18px", "20px", "24px", "28px", "32px"];
450
+ // Stato della selezione corrente, per evidenziare/abilitare i comandi della toolbar. Aggiornato a ogni transazione
451
+ this.Toolbar = signal(EMPTY_TOOLBAR_STATE, ...(ngDevMode ? [{ debugName: "Toolbar" }] : []));
452
+ // Menu delle tabelle: menu custom e non <select>, perché su alcuni browser la select nativa usata come menu
453
+ // di azioni non permetteva di scegliere le voci. Posizione fixed calcolata dal pulsante: .editor-shell ha
454
+ // overflow hidden e taglierebbe un menu posizionato in absolute. null = chiuso
455
+ this.TableMenu = signal(null, ...(ngDevMode ? [{ debugName: "TableMenu" }] : []));
456
+ this.tableMenuRef = viewChild("tableMenu", ...(ngDevMode ? [{ debugName: "tableMenuRef" }] : []));
419
457
  this.inputChange = new EventEmitter();
420
458
  this.inputFocus = new EventEmitter();
421
459
  this.inputFinalized = new EventEmitter();
460
+ this.positionTableMenu = () => {
461
+ const rect = this.tableMenuButton?.getBoundingClientRect();
462
+ if (rect)
463
+ this.TableMenu.set({ top: rect.bottom + 4, left: rect.left });
464
+ };
422
465
  }
423
466
  registerOnChange(fn) { this.onChange = fn; }
424
467
  registerOnTouched(fn) { this.onTouched = fn; }
@@ -454,6 +497,8 @@ class EditorComponent {
454
497
  element: this.element().nativeElement,
455
498
  extensions: config,
456
499
  editable: !this.readonly(),
500
+ onBlur: () => this.onTouched(),
501
+ onTransaction: () => this.updateToolbarState(),
457
502
  onUpdate: (_) => {
458
503
  let value = "";
459
504
  switch (this.Mode()) {
@@ -482,13 +527,48 @@ class EditorComponent {
482
527
  // normalizzazione per la firma di merda di CEA
483
528
  this.value = this.value?.replace(/^\*\*\*\*\*\*\s\s/g, '') || "";
484
529
  this.value = this.value?.replace(/^\*\*\s\s/g, '') || "";
485
- this.EditorRef?.commands.clearContent();
530
+ // Il caricamento di un valore non è una modifica dell'utente: niente evento di update,
531
+ // quindi niente onChange e il controllo resta pristine
486
532
  if (this.Mode() === "markdown")
487
- this.EditorRef?.commands.setContent(this.value, { contentType: "markdown" });
533
+ this.EditorRef?.commands.setContent(this.value, { contentType: "markdown", emitUpdate: false });
488
534
  else if (this.Mode() === "html")
489
- this.EditorRef?.commands.setContent(this.value, { contentType: "html" });
535
+ this.EditorRef?.commands.setContent(this.value, { contentType: "html", emitUpdate: false });
536
+ else
537
+ this.EditorRef?.chain().setMeta("preventUpdate", true).clearContent(false).insertContent(this.value).run();
538
+ }
539
+ updateToolbarState() {
540
+ const editor = this.EditorRef;
541
+ if (!editor)
542
+ return;
543
+ const attrs = editor.getAttributes("textStyle");
544
+ const level = [1, 2, 3, 4, 5, 6].find(l => editor.isActive("heading", { level: l }));
545
+ this.Toolbar.set({
546
+ block: level ? `h${level}` : "paragraph",
547
+ // "" = predefinito, misto o non in elenco
548
+ fontFamily: this.FontFamilies.find(f => sameFontFamily(f.value, attrs["fontFamily"]))?.value || "",
549
+ fontSize: this.FontSizes.find(s => s === attrs["fontSize"]) || "",
550
+ bold: editor.isActive("bold"),
551
+ italic: editor.isActive("italic"),
552
+ underline: editor.isActive("underline"),
553
+ bulletList: editor.isActive("bulletList"),
554
+ inTable: this.TablesSupport() && editor.can().deleteTable(),
555
+ canUndo: editor.can().undo(),
556
+ canRedo: editor.can().redo(),
557
+ });
558
+ }
559
+ setFontFamily(selectElement) {
560
+ const value = selectElement.target.value;
561
+ if (value)
562
+ this.EditorRef?.chain().focus().setFontFamily(value).run();
563
+ else
564
+ this.EditorRef?.chain().focus().unsetFontFamily().run();
565
+ }
566
+ setFontSize(selectElement) {
567
+ const value = selectElement.target.value;
568
+ if (value)
569
+ this.EditorRef?.chain().focus().setFontSize(value).run();
490
570
  else
491
- this.EditorRef?.commands.insertContent(this.value);
571
+ this.EditorRef?.chain().focus().unsetFontSize().run();
492
572
  }
493
573
  setTypography(selectElement) {
494
574
  const select = selectElement.target;
@@ -500,7 +580,6 @@ class EditorComponent {
500
580
  this.EditorRef?.chain().focus().setHeading({ level: parseInt(select.value.charAt(1)) }).run();
501
581
  break;
502
582
  }
503
- select.value = "";
504
583
  }
505
584
  setBold() {
506
585
  this.EditorRef?.chain().focus().toggleBold().run();
@@ -538,30 +617,96 @@ class EditorComponent {
538
617
  deleteColumn() {
539
618
  this.EditorRef?.chain().focus().deleteColumn().run();
540
619
  }
620
+ toggleTableMenu(button) {
621
+ if (this.TableMenu()) {
622
+ this.closeTableMenu();
623
+ return;
624
+ }
625
+ this.tableMenuButton = button;
626
+ this.positionTableMenu();
627
+ // Il menu segue il pulsante: scroll in capture per intercettare anche i contenitori scrollabili, non solo la pagina
628
+ window.addEventListener("scroll", this.positionTableMenu, true);
629
+ window.addEventListener("resize", this.positionTableMenu);
630
+ }
631
+ tableAction(action) {
632
+ this.closeTableMenu();
633
+ switch (action) {
634
+ case "insert":
635
+ this.addTable();
636
+ break;
637
+ case "addRow":
638
+ this.addRow();
639
+ break;
640
+ case "deleteRow":
641
+ this.deleteRow();
642
+ break;
643
+ case "addColumn":
644
+ this.addColumn();
645
+ break;
646
+ case "deleteColumn":
647
+ this.deleteColumn();
648
+ break;
649
+ case "delete":
650
+ this.deleteTable();
651
+ break;
652
+ }
653
+ }
654
+ // Chiusura del menu tabelle: click fuori o Esc
655
+ onDocumentMouseDown(event) {
656
+ if (this.TableMenu() && !this.tableMenuRef()?.nativeElement.contains(event.target))
657
+ this.closeTableMenu();
658
+ }
659
+ closeTableMenu() {
660
+ if (!this.TableMenu())
661
+ return;
662
+ this.TableMenu.set(null);
663
+ window.removeEventListener("scroll", this.positionTableMenu, true);
664
+ window.removeEventListener("resize", this.positionTableMenu);
665
+ }
666
+ ngOnDestroy() {
667
+ this.closeTableMenu();
668
+ }
541
669
  setEmoji(selectElement) {
542
670
  const select = selectElement.target;
543
671
  this.EditorRef?.chain().focus().insertContent(select.value).run();
544
672
  select.value = "";
545
673
  }
546
674
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: EditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
547
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: EditorComponent, isStandalone: true, selector: "es-editor", inputs: { EmojiSupport: { classPropertyName: "EmojiSupport", publicName: "EmojiSupport", isSignal: true, isRequired: false, transformFunction: null }, BulletListSupport: { classPropertyName: "BulletListSupport", publicName: "BulletListSupport", isSignal: true, isRequired: false, transformFunction: null }, TablesSupport: { classPropertyName: "TablesSupport", publicName: "TablesSupport", isSignal: true, isRequired: false, transformFunction: null }, Mode: { classPropertyName: "Mode", publicName: "Mode", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, MentionEntities: { classPropertyName: "MentionEntities", publicName: "MentionEntities", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { inputChange: "inputChange", inputFocus: "inputFocus", inputFinalized: "inputFinalized" }, providers: [
675
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: EditorComponent, isStandalone: true, selector: "es-editor", inputs: { EmojiSupport: { classPropertyName: "EmojiSupport", publicName: "EmojiSupport", isSignal: true, isRequired: false, transformFunction: null }, BulletListSupport: { classPropertyName: "BulletListSupport", publicName: "BulletListSupport", isSignal: true, isRequired: false, transformFunction: null }, TablesSupport: { classPropertyName: "TablesSupport", publicName: "TablesSupport", isSignal: true, isRequired: false, transformFunction: null }, Mode: { classPropertyName: "Mode", publicName: "Mode", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, MentionEntities: { classPropertyName: "MentionEntities", publicName: "MentionEntities", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { inputChange: "inputChange", inputFocus: "inputFocus", inputFinalized: "inputFinalized" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event)", "document:keydown.escape": "closeTableMenu()" } }, providers: [
548
676
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => EditorComponent), multi: true },
549
677
  { provide: NG_VALIDATORS, useExisting: forwardRef(() => EditorComponent), multi: true }
550
- ], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <div class=\"editor-toolbar\">\r\n\r\n <!-- Typography -->\r\n <select id=\"heading-select\" (change)=\"setTypography($event)\">\r\n <option value=\"\" selected hidden>Pragrafo</option>\r\n <option value=\"paragraph\">Pragrafo</option>\r\n <option value=\"h1\">Intestazione 1</option>\r\n <option value=\"h2\">Intestazione 2</option>\r\n <option value=\"h3\">Intestazione 3</option>\r\n <option value=\"h4\">Intestazione 4</option>\r\n <option value=\"h5\">Intestazione 5</option>\r\n <option value=\"h6\">Intestazione 6</option>\r\n </select>\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" (click)=\"setBold()\"><b>B</b></button>\r\n <button type=\"button\" (click)=\"setItalic()\"><i>I</i></button>\r\n <button type=\"button\" (click)=\"setUnderlined()\"><u>U</u></button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" (click)=\"setBulletList()\">\u2022 Lista</button>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n @if(Mode() == \"html\" && TablesSupport())\r\n {\r\n <button type=\"button\" (click)=\"addTable()\">\u229E<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteTable()\">\u229E<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <button type=\"button\" (click)=\"addRow()\">\uD83D\uDDA8<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteRow()\">\uD83D\uDDA8<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <button type=\"button\" (click)=\"addColumn()\">\uD83D\uDDC4<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteColumn()\">\uD83D\uDDC4<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <div class=\"divider\"></div>\r\n }\r\n\r\n <!-- History -->\r\n <button type=\"button\" (click)=\"undoAction()\">\u21B6</button>\r\n <button type=\"button\" (click)=\"redoAction()\">\u21B7</button>\r\n\r\n @if(EmojiSupport()){\r\n <select id=\"emoji-select\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE0A\">\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE00\">\uD83D\uDE00</option>\r\n <option value=\"\uD83D\uDE02\">\uD83D\uDE02</option>\r\n <option value=\"\uD83D\uDD25\">\uD83D\uDD25</option>\r\n <option value=\"\uD83C\uDF89\">\uD83C\uDF89</option>\r\n <option value=\"\uD83D\uDE80\">\uD83D\uDE80</option>\r\n <option value=\"\u2764\uFE0F\">\u2764\uFE0F</option>\r\n <option value=\"\uD83D\uDC4D\">\uD83D\uDC4D</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>", styles: [".editor-shell{border:1px solid #dcdcdc;border-radius:10px;background:#fff;overflow:hidden;isolation:isolate;box-shadow:0 1px 2px #0000000a,0 6px 24px #0000000d;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.editor-shell.readonly{border:none;overflow:visible;box-shadow:none}.editor-toolbar{display:flex;align-items:center;gap:4px;padding:4px;background:linear-gradient(to bottom,#fafafa,#f3f3f3);border-bottom:1px solid #e5e5e5;flex-wrap:wrap}.editor-toolbar button{display:inline-flex;align-items:center;justify-content:center;line-height:1;min-width:36px;height:36px;padding:0 12px;border:1px solid #ddd;border-radius:8px;background:transparent;color:#333;font-size:18px;font-weight:500;cursor:pointer;transition:background .12s ease,border-color .12s ease,color .12s ease}.editor-toolbar button:hover{background:#e9e9e9}.editor-toolbar button:active{transform:translateY(1px)}.editor-toolbar button.is-active{background:#dfe7ff;border-color:#c7d2fe;color:#2342c0}.editor-toolbar select{height:36px;padding:0 12px;border:1px solid #d6d6d6;border-radius:8px;background:#fff;font-size:14px;color:#222;cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease,background .12s ease}.editor-toolbar select:hover{background:#fafafa}.editor-toolbar select:focus{outline:none;border-color:#8ba8ff;box-shadow:0 0 0 3px #6082ff26}.editor-toolbar .divider{width:1px;height:24px;background:#ddd;margin:0 2px}.ProseMirror{min-height:60px;padding:12px;outline:none;font-size:16px;line-height:1.7;color:#1f1f1f;caret-color:#2563eb}.ProseMirror h1,.ProseMirror h2,.ProseMirror h3{line-height:1.2;margin-top:.8em;margin-bottom:.4em;font-weight:700;letter-spacing:-.02em}.ProseMirror h1{font-size:2rem}.ProseMirror h2{font-size:1.5rem}.ProseMirror h3{font-size:1.25rem}.ProseMirror p{margin:0}.ProseMirror ul,.ProseMirror ol{padding-left:1.5rem;margin:5px 0}.ProseMirror li{margin:0}.ProseMirror blockquote{margin:1.4rem 0;padding-left:1rem;border-left:4px solid #c7d2fe;color:#555}.ProseMirror code{background:#f3f4f6;color:#d63384;padding:.15em .35em;border-radius:4px;font-size:.92em}.ProseMirror pre{background:#1f2937;color:#f9fafb;padding:16px 18px;border-radius:10px;overflow-x:auto;margin:1.2rem 0}.ProseMirror pre code{background:transparent;color:inherit;padding:0}.ProseMirror a{color:#2563eb;text-decoration:underline}.ProseMirror hr{border:none;border-top:1px solid #e2e2e2;margin:2rem 0}.ProseMirror table{width:100%;border-collapse:collapse;margin:1.2rem 0}.ProseMirror th,.ProseMirror td{border:1px solid #ddd;padding:5px;position:relative}.ProseMirror th{background:#f5f5f5;text-align:left}.ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:col-resize;background:transparent;z-index:20}.ProseMirror ::selection{background:#6082ff40}.suggestion-popup{display:flex;flex-direction:column;min-width:220px;padding:6px;background:#fff;z-index:99999999;border:1px solid #e5e5e5;border-radius:10px;box-shadow:0 12px 30px #00000014,0 2px 8px #0000000d}.suggestion-popup button{border:none;background:transparent;border-radius:8px;padding:8px 10px;text-align:left;cursor:pointer;font-size:14px}.suggestion-popup button:hover,.suggestion-popup button.is-selected{background:#eef2ff}.mention{display:inline-flex;align-items:center;background:#eef2ff;color:#304ffe;padding:2px 6px;border-radius:5px;font-weight:500}.img-wrapper{position:relative;display:inline-block;margin:12px 0}.img-wrapper img{max-width:100%;border-radius:10px;transition:opacity .2s ease}.img-toolbar{position:absolute;top:8px;left:8px;display:flex;gap:6px;background:#fffffff2;border:1px solid #e5e5e5;border-radius:8px;padding:4px;box-shadow:0 8px 20px #00000014}.img-toolbar.readonly{display:none}.img-toolbar button{border:none;background:transparent;padding:4px 6px;cursor:pointer;font-size:12px}.img-toolbar button:hover{background:#eef2ff;border-radius:6px}.img-resize-handle{position:absolute;right:0;bottom:0;width:12px;height:12px;background:#2563eb;border-radius:3px;cursor:se-resize}.img-resize-handle.readonly{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
678
+ ], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, isSignal: true }, { propertyName: "tableMenuRef", first: true, predicate: ["tableMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <!-- (mousedown) preventDefault sui pulsanti: il click non toglie il focus all'editor, quindi la selezione resta visibile -->\r\n <div class=\"editor-toolbar\" role=\"toolbar\" aria-label=\"Formattazione\">\r\n\r\n <!-- Typography -->\r\n <select class=\"heading-select\" title=\"Stile del paragrafo\" (change)=\"setTypography($event)\">\r\n <option value=\"paragraph\" [selected]=\"Toolbar().block == 'paragraph'\">Paragrafo</option>\r\n <option value=\"h1\" [selected]=\"Toolbar().block == 'h1'\">Intestazione 1</option>\r\n <option value=\"h2\" [selected]=\"Toolbar().block == 'h2'\">Intestazione 2</option>\r\n <option value=\"h3\" [selected]=\"Toolbar().block == 'h3'\">Intestazione 3</option>\r\n <option value=\"h4\" [selected]=\"Toolbar().block == 'h4'\">Intestazione 4</option>\r\n <option value=\"h5\" [selected]=\"Toolbar().block == 'h5'\">Intestazione 5</option>\r\n <option value=\"h6\" [selected]=\"Toolbar().block == 'h6'\">Intestazione 6</option>\r\n </select>\r\n\r\n <!-- Font: solo html, il markdown non ha una sintassi per rappresentarli -->\r\n @if(Mode() == \"html\"){\r\n <select class=\"font-family-select\" title=\"Carattere\" (change)=\"setFontFamily($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontFamily == ''\">Carattere</option>\r\n @for(f of FontFamilies; track f.value){\r\n <option [value]=\"f.value\" [selected]=\"Toolbar().fontFamily == f.value\" [style.font-family]=\"f.value\">{{ f.label }}</option>\r\n }\r\n </select>\r\n <select class=\"font-size-select\" title=\"Dimensione\" (change)=\"setFontSize($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontSize == ''\">Dimensione</option>\r\n @for(s of FontSizes; track s){\r\n <option [value]=\"s\" [selected]=\"Toolbar().fontSize == s\">{{ s }}</option>\r\n }\r\n </select>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Grassetto\" aria-label=\"Grassetto\" [class.is-active]=\"Toolbar().bold\" [attr.aria-pressed]=\"Toolbar().bold\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBold()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Corsivo\" aria-label=\"Corsivo\" [class.is-active]=\"Toolbar().italic\" [attr.aria-pressed]=\"Toolbar().italic\" (mousedown)=\"$event.preventDefault()\" (click)=\"setItalic()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M19 4h-9M14 20H5M15 4 9 20\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Sottolineato\" aria-label=\"Sottolineato\" [class.is-active]=\"Toolbar().underline\" [attr.aria-pressed]=\"Toolbar().underline\" (mousedown)=\"$event.preventDefault()\" (click)=\"setUnderlined()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 4v6a6 6 0 0 0 12 0V4M4 20h16\" /></svg>\r\n </button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" class=\"tb-btn\" title=\"Elenco puntato\" aria-label=\"Elenco puntato\" [class.is-active]=\"Toolbar().bulletList\" [attr.aria-pressed]=\"Toolbar().bulletList\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBulletList()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01\" /></svg>\r\n </button>\r\n }\r\n\r\n <!-- Tables: un unico menu, le voci che agiscono su una tabella esistente sono attive solo con il cursore al suo interno -->\r\n @if(Mode() == \"html\" && TablesSupport()){\r\n <div class=\"divider\"></div>\r\n <div class=\"tb-dropdown\" #tableMenu>\r\n <button #tableMenuButton type=\"button\" class=\"tb-btn tb-btn-text\" title=\"Tabella\" aria-haspopup=\"menu\" [class.is-active]=\"!!TableMenu()\" [attr.aria-expanded]=\"!!TableMenu()\" (mousedown)=\"$event.preventDefault()\" (click)=\"toggleTableMenu(tableMenuButton)\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><path d=\"M3 9h18M3 15h18M12 3v18\" /></svg>\r\n <span>Tabella</span>\r\n <svg class=\"chevron\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\" /></svg>\r\n </button>\r\n @if(TableMenu(); as pos){\r\n <div class=\"tb-dropdown-menu\" role=\"menu\" [style.top.px]=\"pos.top\" [style.left.px]=\"pos.left\">\r\n <button type=\"button\" role=\"menuitem\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('insert')\">Inserisci tabella</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addRow')\">Aggiungi riga sotto</button>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addColumn')\">Aggiungi colonna a destra</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteRow')\">Elimina riga</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteColumn')\">Elimina colonna</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('delete')\">Elimina tabella</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- History -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Annulla\" aria-label=\"Annulla\" [disabled]=\"!Toolbar().canUndo\" (mousedown)=\"$event.preventDefault()\" (click)=\"undoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 14 4 9l5-5\" /><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Ripeti\" aria-label=\"Ripeti\" [disabled]=\"!Toolbar().canRedo\" (mousedown)=\"$event.preventDefault()\" (click)=\"redoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m15 14 5-5-5-5\" /><path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" /></svg>\r\n </button>\r\n\r\n @if(EmojiSupport()){\r\n <select class=\"emoji-select\" title=\"Emoji\" aria-label=\"Emoji\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE0A\">\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE00\">\uD83D\uDE00</option>\r\n <option value=\"\uD83D\uDE02\">\uD83D\uDE02</option>\r\n <option value=\"\uD83D\uDD25\">\uD83D\uDD25</option>\r\n <option value=\"\uD83C\uDF89\">\uD83C\uDF89</option>\r\n <option value=\"\uD83D\uDE80\">\uD83D\uDE80</option>\r\n <option value=\"\u2764\uFE0F\">\u2764\uFE0F</option>\r\n <option value=\"\uD83D\uDC4D\">\uD83D\uDC4D</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>\r\n", styles: [".editor-shell{--es-editor-border: #e2e4e9;--es-editor-toolbar-bg: #fafbfc;--es-editor-text: #1f2328;--es-editor-icon: #4b5563;--es-editor-hover: #eef0f3;--es-editor-accent: #2342c0;--es-editor-accent-soft: #e5ebff;--es-editor-focus: rgba(35, 66, 192, .28);border:1px solid var(--es-editor-border);border-radius:10px;background:#fff;overflow:hidden;isolation:isolate;box-shadow:0 1px 2px #0000000a,0 6px 24px #0000000d;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.editor-shell.readonly{border:none;overflow:visible;box-shadow:none}.editor-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:6px 8px;background:var(--es-editor-toolbar-bg);border-bottom:1px solid var(--es-editor-border);font-size:13px;color:var(--es-editor-text)}.editor-toolbar svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.editor-toolbar .tb-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--es-editor-icon);cursor:pointer;transition:background .12s ease,color .12s ease}.editor-toolbar .tb-btn:hover:not(:disabled){background:var(--es-editor-hover);color:var(--es-editor-text)}.editor-toolbar .tb-btn.is-active{background:var(--es-editor-accent-soft);color:var(--es-editor-accent)}.editor-toolbar .tb-btn:disabled{opacity:.35;cursor:default}.editor-toolbar .tb-btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--es-editor-focus)}.editor-toolbar select{height:32px;padding:0 28px 0 10px;border:1px solid var(--es-editor-border);border-radius:6px;appearance:none;background:#fff url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\") no-repeat right 8px center/14px;font:inherit;color:var(--es-editor-text);cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease}.editor-toolbar select:hover{border-color:#c9cdd4}.editor-toolbar select:focus-visible{outline:none;border-color:var(--es-editor-accent);box-shadow:0 0 0 3px var(--es-editor-focus)}.editor-toolbar .heading-select{width:136px}.editor-toolbar .font-family-select{width:148px;margin-left:4px}.editor-toolbar .font-size-select{width:112px;margin-left:4px}.editor-toolbar .emoji-select{width:44px;padding:0 0 0 10px;border-color:transparent;background:transparent;font-size:16px}.editor-toolbar .emoji-select:hover{border-color:transparent;background:var(--es-editor-hover)}.editor-toolbar .tb-btn.tb-btn-text{width:auto;gap:6px;padding:0 6px 0 8px;font:inherit}.editor-toolbar .tb-btn.tb-btn-text .chevron{width:14px;height:14px;opacity:.7}.editor-toolbar .tb-dropdown{display:inline-flex}.editor-toolbar .tb-dropdown-menu{position:fixed;z-index:1000;display:flex;flex-direction:column;min-width:210px;padding:4px;background:#fff;border:1px solid var(--es-editor-border);border-radius:8px;box-shadow:0 12px 30px #0000001a,0 2px 8px #0000000f}.editor-toolbar .tb-dropdown-menu button{padding:7px 10px;border:none;border-radius:6px;background:transparent;font:inherit;color:var(--es-editor-text);text-align:left;white-space:nowrap;cursor:pointer}.editor-toolbar .tb-dropdown-menu button:hover:not(:disabled),.editor-toolbar .tb-dropdown-menu button:focus-visible{outline:none;background:var(--es-editor-hover)}.editor-toolbar .tb-dropdown-menu button.danger:hover:not(:disabled){background:#fdecec;color:#c62828}.editor-toolbar .tb-dropdown-menu button:disabled{opacity:.4;cursor:default}.editor-toolbar .tb-dropdown-separator{height:1px;margin:4px 2px;background:var(--es-editor-border)}.editor-toolbar .divider{width:1px;height:20px;background:var(--es-editor-border);margin:0 6px}.ProseMirror{min-height:60px;padding:12px;outline:none;font-size:16px;line-height:1.7;color:#1f1f1f;caret-color:#2563eb}.ProseMirror h1,.ProseMirror h2,.ProseMirror h3{line-height:1.2;margin-top:.8em;margin-bottom:.4em;font-weight:700;letter-spacing:-.02em}.ProseMirror h1{font-size:2rem}.ProseMirror h2{font-size:1.5rem}.ProseMirror h3{font-size:1.25rem}.ProseMirror p{margin:0}.ProseMirror ul,.ProseMirror ol{padding-left:1.5rem;margin:5px 0;display:flow-root}.ProseMirror li{margin:0}.ProseMirror blockquote{margin:1.4rem 0;padding-left:1rem;border-left:4px solid #c7d2fe;color:#555}.ProseMirror code{background:#f3f4f6;color:#d63384;padding:.15em .35em;border-radius:4px;font-size:.92em}.ProseMirror pre{background:#1f2937;color:#f9fafb;padding:16px 18px;border-radius:10px;overflow-x:auto;margin:1.2rem 0}.ProseMirror pre code{background:transparent;color:inherit;padding:0}.ProseMirror a{color:#2563eb;text-decoration:underline}.ProseMirror hr{border:none;border-top:1px solid #e2e2e2;margin:2rem 0}.ProseMirror table{width:100%;border-collapse:collapse;margin:1.2rem 0}.ProseMirror th,.ProseMirror td{border:1px solid #ddd;padding:5px;position:relative}.ProseMirror th{background:#f5f5f5;text-align:left}.ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:col-resize;background:transparent;z-index:20}.ProseMirror ::selection{background:#6082ff40}.suggestion-popup{display:flex;flex-direction:column;min-width:220px;padding:6px;background:#fff;z-index:99999999;border:1px solid #e5e5e5;border-radius:10px;box-shadow:0 12px 30px #00000014,0 2px 8px #0000000d}.suggestion-popup button{border:none;background:transparent;border-radius:8px;padding:8px 10px;text-align:left;cursor:pointer;font-size:14px}.suggestion-popup button:hover,.suggestion-popup button.is-selected{background:#eef2ff}.mention{display:inline-flex;align-items:center;background:#eef2ff;color:#304ffe;padding:2px 6px;border-radius:5px;font-weight:500}.img-wrapper{position:relative;display:inline-block;margin:12px 0}.img-wrapper img{max-width:100%;border-radius:10px;transition:opacity .2s ease}.img-wrapper.ProseMirror-selectednode img{outline:2px solid var(--es-editor-accent, #2342c0);outline-offset:2px}.img-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:2px;background:#fffffff5;border:1px solid var(--es-editor-border, #e2e4e9);border-radius:8px;padding:3px;box-shadow:0 8px 20px #00000014;opacity:0;pointer-events:none;transition:opacity .12s ease}.img-toolbar.readonly{display:none}.img-wrapper:hover .img-toolbar,.img-wrapper.ProseMirror-selectednode .img-toolbar{opacity:1;pointer-events:auto}.img-toolbar button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--es-editor-icon, #4b5563);cursor:pointer}.img-toolbar button:hover{background:var(--es-editor-hover, #eef0f3)}.img-toolbar button.is-active{background:var(--es-editor-accent-soft, #e5ebff);color:var(--es-editor-accent, #2342c0)}.img-toolbar button.danger:hover{background:#fdecec;color:#c62828}.img-toolbar svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.img-toolbar-divider{width:1px;height:16px;margin:0 3px;background:var(--es-editor-border, #e2e4e9)}.img-resize-handle{position:absolute;right:-5px;bottom:-5px;width:12px;height:12px;background:#fff;border:2px solid var(--es-editor-accent, #2342c0);border-radius:3px;box-shadow:0 1px 3px #0003;cursor:se-resize;opacity:0;transition:opacity .12s ease}.img-resize-handle.readonly{display:none}.img-wrapper:hover .img-resize-handle,.img-wrapper.ProseMirror-selectednode .img-resize-handle{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
551
679
  }
552
680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: EditorComponent, decorators: [{
553
681
  type: Component,
554
682
  args: [{ selector: "es-editor", standalone: true, imports: [CommonModule, FormsModule], encapsulation: ViewEncapsulation.None, providers: [
555
683
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => EditorComponent), multi: true },
556
684
  { provide: NG_VALIDATORS, useExisting: forwardRef(() => EditorComponent), multi: true }
557
- ], template: "<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <div class=\"editor-toolbar\">\r\n\r\n <!-- Typography -->\r\n <select id=\"heading-select\" (change)=\"setTypography($event)\">\r\n <option value=\"\" selected hidden>Pragrafo</option>\r\n <option value=\"paragraph\">Pragrafo</option>\r\n <option value=\"h1\">Intestazione 1</option>\r\n <option value=\"h2\">Intestazione 2</option>\r\n <option value=\"h3\">Intestazione 3</option>\r\n <option value=\"h4\">Intestazione 4</option>\r\n <option value=\"h5\">Intestazione 5</option>\r\n <option value=\"h6\">Intestazione 6</option>\r\n </select>\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" (click)=\"setBold()\"><b>B</b></button>\r\n <button type=\"button\" (click)=\"setItalic()\"><i>I</i></button>\r\n <button type=\"button\" (click)=\"setUnderlined()\"><u>U</u></button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" (click)=\"setBulletList()\">\u2022 Lista</button>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n @if(Mode() == \"html\" && TablesSupport())\r\n {\r\n <button type=\"button\" (click)=\"addTable()\">\u229E<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteTable()\">\u229E<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <button type=\"button\" (click)=\"addRow()\">\uD83D\uDDA8<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteRow()\">\uD83D\uDDA8<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <button type=\"button\" (click)=\"addColumn()\">\uD83D\uDDC4<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteColumn()\">\uD83D\uDDC4<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <div class=\"divider\"></div>\r\n }\r\n\r\n <!-- History -->\r\n <button type=\"button\" (click)=\"undoAction()\">\u21B6</button>\r\n <button type=\"button\" (click)=\"redoAction()\">\u21B7</button>\r\n\r\n @if(EmojiSupport()){\r\n <select id=\"emoji-select\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE0A\">\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE00\">\uD83D\uDE00</option>\r\n <option value=\"\uD83D\uDE02\">\uD83D\uDE02</option>\r\n <option value=\"\uD83D\uDD25\">\uD83D\uDD25</option>\r\n <option value=\"\uD83C\uDF89\">\uD83C\uDF89</option>\r\n <option value=\"\uD83D\uDE80\">\uD83D\uDE80</option>\r\n <option value=\"\u2764\uFE0F\">\u2764\uFE0F</option>\r\n <option value=\"\uD83D\uDC4D\">\uD83D\uDC4D</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>", styles: [".editor-shell{border:1px solid #dcdcdc;border-radius:10px;background:#fff;overflow:hidden;isolation:isolate;box-shadow:0 1px 2px #0000000a,0 6px 24px #0000000d;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.editor-shell.readonly{border:none;overflow:visible;box-shadow:none}.editor-toolbar{display:flex;align-items:center;gap:4px;padding:4px;background:linear-gradient(to bottom,#fafafa,#f3f3f3);border-bottom:1px solid #e5e5e5;flex-wrap:wrap}.editor-toolbar button{display:inline-flex;align-items:center;justify-content:center;line-height:1;min-width:36px;height:36px;padding:0 12px;border:1px solid #ddd;border-radius:8px;background:transparent;color:#333;font-size:18px;font-weight:500;cursor:pointer;transition:background .12s ease,border-color .12s ease,color .12s ease}.editor-toolbar button:hover{background:#e9e9e9}.editor-toolbar button:active{transform:translateY(1px)}.editor-toolbar button.is-active{background:#dfe7ff;border-color:#c7d2fe;color:#2342c0}.editor-toolbar select{height:36px;padding:0 12px;border:1px solid #d6d6d6;border-radius:8px;background:#fff;font-size:14px;color:#222;cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease,background .12s ease}.editor-toolbar select:hover{background:#fafafa}.editor-toolbar select:focus{outline:none;border-color:#8ba8ff;box-shadow:0 0 0 3px #6082ff26}.editor-toolbar .divider{width:1px;height:24px;background:#ddd;margin:0 2px}.ProseMirror{min-height:60px;padding:12px;outline:none;font-size:16px;line-height:1.7;color:#1f1f1f;caret-color:#2563eb}.ProseMirror h1,.ProseMirror h2,.ProseMirror h3{line-height:1.2;margin-top:.8em;margin-bottom:.4em;font-weight:700;letter-spacing:-.02em}.ProseMirror h1{font-size:2rem}.ProseMirror h2{font-size:1.5rem}.ProseMirror h3{font-size:1.25rem}.ProseMirror p{margin:0}.ProseMirror ul,.ProseMirror ol{padding-left:1.5rem;margin:5px 0}.ProseMirror li{margin:0}.ProseMirror blockquote{margin:1.4rem 0;padding-left:1rem;border-left:4px solid #c7d2fe;color:#555}.ProseMirror code{background:#f3f4f6;color:#d63384;padding:.15em .35em;border-radius:4px;font-size:.92em}.ProseMirror pre{background:#1f2937;color:#f9fafb;padding:16px 18px;border-radius:10px;overflow-x:auto;margin:1.2rem 0}.ProseMirror pre code{background:transparent;color:inherit;padding:0}.ProseMirror a{color:#2563eb;text-decoration:underline}.ProseMirror hr{border:none;border-top:1px solid #e2e2e2;margin:2rem 0}.ProseMirror table{width:100%;border-collapse:collapse;margin:1.2rem 0}.ProseMirror th,.ProseMirror td{border:1px solid #ddd;padding:5px;position:relative}.ProseMirror th{background:#f5f5f5;text-align:left}.ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:col-resize;background:transparent;z-index:20}.ProseMirror ::selection{background:#6082ff40}.suggestion-popup{display:flex;flex-direction:column;min-width:220px;padding:6px;background:#fff;z-index:99999999;border:1px solid #e5e5e5;border-radius:10px;box-shadow:0 12px 30px #00000014,0 2px 8px #0000000d}.suggestion-popup button{border:none;background:transparent;border-radius:8px;padding:8px 10px;text-align:left;cursor:pointer;font-size:14px}.suggestion-popup button:hover,.suggestion-popup button.is-selected{background:#eef2ff}.mention{display:inline-flex;align-items:center;background:#eef2ff;color:#304ffe;padding:2px 6px;border-radius:5px;font-weight:500}.img-wrapper{position:relative;display:inline-block;margin:12px 0}.img-wrapper img{max-width:100%;border-radius:10px;transition:opacity .2s ease}.img-toolbar{position:absolute;top:8px;left:8px;display:flex;gap:6px;background:#fffffff2;border:1px solid #e5e5e5;border-radius:8px;padding:4px;box-shadow:0 8px 20px #00000014}.img-toolbar.readonly{display:none}.img-toolbar button{border:none;background:transparent;padding:4px 6px;cursor:pointer;font-size:12px}.img-toolbar button:hover{background:#eef2ff;border-radius:6px}.img-resize-handle{position:absolute;right:0;bottom:0;width:12px;height:12px;background:#2563eb;border-radius:3px;cursor:se-resize}.img-resize-handle.readonly{display:none}\n"] }]
558
- }], propDecorators: { element: [{ type: i0.ViewChild, args: ["element", { isSignal: true }] }], EmojiSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "EmojiSupport", required: false }] }], BulletListSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "BulletListSupport", required: false }] }], TablesSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "TablesSupport", required: false }] }], Mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "Mode", required: true }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], MentionEntities: [{ type: i0.Input, args: [{ isSignal: true, alias: "MentionEntities", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], inputChange: [{
685
+ ], template: "<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <!-- (mousedown) preventDefault sui pulsanti: il click non toglie il focus all'editor, quindi la selezione resta visibile -->\r\n <div class=\"editor-toolbar\" role=\"toolbar\" aria-label=\"Formattazione\">\r\n\r\n <!-- Typography -->\r\n <select class=\"heading-select\" title=\"Stile del paragrafo\" (change)=\"setTypography($event)\">\r\n <option value=\"paragraph\" [selected]=\"Toolbar().block == 'paragraph'\">Paragrafo</option>\r\n <option value=\"h1\" [selected]=\"Toolbar().block == 'h1'\">Intestazione 1</option>\r\n <option value=\"h2\" [selected]=\"Toolbar().block == 'h2'\">Intestazione 2</option>\r\n <option value=\"h3\" [selected]=\"Toolbar().block == 'h3'\">Intestazione 3</option>\r\n <option value=\"h4\" [selected]=\"Toolbar().block == 'h4'\">Intestazione 4</option>\r\n <option value=\"h5\" [selected]=\"Toolbar().block == 'h5'\">Intestazione 5</option>\r\n <option value=\"h6\" [selected]=\"Toolbar().block == 'h6'\">Intestazione 6</option>\r\n </select>\r\n\r\n <!-- Font: solo html, il markdown non ha una sintassi per rappresentarli -->\r\n @if(Mode() == \"html\"){\r\n <select class=\"font-family-select\" title=\"Carattere\" (change)=\"setFontFamily($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontFamily == ''\">Carattere</option>\r\n @for(f of FontFamilies; track f.value){\r\n <option [value]=\"f.value\" [selected]=\"Toolbar().fontFamily == f.value\" [style.font-family]=\"f.value\">{{ f.label }}</option>\r\n }\r\n </select>\r\n <select class=\"font-size-select\" title=\"Dimensione\" (change)=\"setFontSize($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontSize == ''\">Dimensione</option>\r\n @for(s of FontSizes; track s){\r\n <option [value]=\"s\" [selected]=\"Toolbar().fontSize == s\">{{ s }}</option>\r\n }\r\n </select>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Grassetto\" aria-label=\"Grassetto\" [class.is-active]=\"Toolbar().bold\" [attr.aria-pressed]=\"Toolbar().bold\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBold()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Corsivo\" aria-label=\"Corsivo\" [class.is-active]=\"Toolbar().italic\" [attr.aria-pressed]=\"Toolbar().italic\" (mousedown)=\"$event.preventDefault()\" (click)=\"setItalic()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M19 4h-9M14 20H5M15 4 9 20\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Sottolineato\" aria-label=\"Sottolineato\" [class.is-active]=\"Toolbar().underline\" [attr.aria-pressed]=\"Toolbar().underline\" (mousedown)=\"$event.preventDefault()\" (click)=\"setUnderlined()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 4v6a6 6 0 0 0 12 0V4M4 20h16\" /></svg>\r\n </button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" class=\"tb-btn\" title=\"Elenco puntato\" aria-label=\"Elenco puntato\" [class.is-active]=\"Toolbar().bulletList\" [attr.aria-pressed]=\"Toolbar().bulletList\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBulletList()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01\" /></svg>\r\n </button>\r\n }\r\n\r\n <!-- Tables: un unico menu, le voci che agiscono su una tabella esistente sono attive solo con il cursore al suo interno -->\r\n @if(Mode() == \"html\" && TablesSupport()){\r\n <div class=\"divider\"></div>\r\n <div class=\"tb-dropdown\" #tableMenu>\r\n <button #tableMenuButton type=\"button\" class=\"tb-btn tb-btn-text\" title=\"Tabella\" aria-haspopup=\"menu\" [class.is-active]=\"!!TableMenu()\" [attr.aria-expanded]=\"!!TableMenu()\" (mousedown)=\"$event.preventDefault()\" (click)=\"toggleTableMenu(tableMenuButton)\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><path d=\"M3 9h18M3 15h18M12 3v18\" /></svg>\r\n <span>Tabella</span>\r\n <svg class=\"chevron\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\" /></svg>\r\n </button>\r\n @if(TableMenu(); as pos){\r\n <div class=\"tb-dropdown-menu\" role=\"menu\" [style.top.px]=\"pos.top\" [style.left.px]=\"pos.left\">\r\n <button type=\"button\" role=\"menuitem\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('insert')\">Inserisci tabella</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addRow')\">Aggiungi riga sotto</button>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addColumn')\">Aggiungi colonna a destra</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteRow')\">Elimina riga</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteColumn')\">Elimina colonna</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('delete')\">Elimina tabella</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- History -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Annulla\" aria-label=\"Annulla\" [disabled]=\"!Toolbar().canUndo\" (mousedown)=\"$event.preventDefault()\" (click)=\"undoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 14 4 9l5-5\" /><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Ripeti\" aria-label=\"Ripeti\" [disabled]=\"!Toolbar().canRedo\" (mousedown)=\"$event.preventDefault()\" (click)=\"redoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m15 14 5-5-5-5\" /><path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" /></svg>\r\n </button>\r\n\r\n @if(EmojiSupport()){\r\n <select class=\"emoji-select\" title=\"Emoji\" aria-label=\"Emoji\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE0A\">\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE00\">\uD83D\uDE00</option>\r\n <option value=\"\uD83D\uDE02\">\uD83D\uDE02</option>\r\n <option value=\"\uD83D\uDD25\">\uD83D\uDD25</option>\r\n <option value=\"\uD83C\uDF89\">\uD83C\uDF89</option>\r\n <option value=\"\uD83D\uDE80\">\uD83D\uDE80</option>\r\n <option value=\"\u2764\uFE0F\">\u2764\uFE0F</option>\r\n <option value=\"\uD83D\uDC4D\">\uD83D\uDC4D</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>\r\n", styles: [".editor-shell{--es-editor-border: #e2e4e9;--es-editor-toolbar-bg: #fafbfc;--es-editor-text: #1f2328;--es-editor-icon: #4b5563;--es-editor-hover: #eef0f3;--es-editor-accent: #2342c0;--es-editor-accent-soft: #e5ebff;--es-editor-focus: rgba(35, 66, 192, .28);border:1px solid var(--es-editor-border);border-radius:10px;background:#fff;overflow:hidden;isolation:isolate;box-shadow:0 1px 2px #0000000a,0 6px 24px #0000000d;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.editor-shell.readonly{border:none;overflow:visible;box-shadow:none}.editor-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:6px 8px;background:var(--es-editor-toolbar-bg);border-bottom:1px solid var(--es-editor-border);font-size:13px;color:var(--es-editor-text)}.editor-toolbar svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.editor-toolbar .tb-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--es-editor-icon);cursor:pointer;transition:background .12s ease,color .12s ease}.editor-toolbar .tb-btn:hover:not(:disabled){background:var(--es-editor-hover);color:var(--es-editor-text)}.editor-toolbar .tb-btn.is-active{background:var(--es-editor-accent-soft);color:var(--es-editor-accent)}.editor-toolbar .tb-btn:disabled{opacity:.35;cursor:default}.editor-toolbar .tb-btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--es-editor-focus)}.editor-toolbar select{height:32px;padding:0 28px 0 10px;border:1px solid var(--es-editor-border);border-radius:6px;appearance:none;background:#fff url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\") no-repeat right 8px center/14px;font:inherit;color:var(--es-editor-text);cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease}.editor-toolbar select:hover{border-color:#c9cdd4}.editor-toolbar select:focus-visible{outline:none;border-color:var(--es-editor-accent);box-shadow:0 0 0 3px var(--es-editor-focus)}.editor-toolbar .heading-select{width:136px}.editor-toolbar .font-family-select{width:148px;margin-left:4px}.editor-toolbar .font-size-select{width:112px;margin-left:4px}.editor-toolbar .emoji-select{width:44px;padding:0 0 0 10px;border-color:transparent;background:transparent;font-size:16px}.editor-toolbar .emoji-select:hover{border-color:transparent;background:var(--es-editor-hover)}.editor-toolbar .tb-btn.tb-btn-text{width:auto;gap:6px;padding:0 6px 0 8px;font:inherit}.editor-toolbar .tb-btn.tb-btn-text .chevron{width:14px;height:14px;opacity:.7}.editor-toolbar .tb-dropdown{display:inline-flex}.editor-toolbar .tb-dropdown-menu{position:fixed;z-index:1000;display:flex;flex-direction:column;min-width:210px;padding:4px;background:#fff;border:1px solid var(--es-editor-border);border-radius:8px;box-shadow:0 12px 30px #0000001a,0 2px 8px #0000000f}.editor-toolbar .tb-dropdown-menu button{padding:7px 10px;border:none;border-radius:6px;background:transparent;font:inherit;color:var(--es-editor-text);text-align:left;white-space:nowrap;cursor:pointer}.editor-toolbar .tb-dropdown-menu button:hover:not(:disabled),.editor-toolbar .tb-dropdown-menu button:focus-visible{outline:none;background:var(--es-editor-hover)}.editor-toolbar .tb-dropdown-menu button.danger:hover:not(:disabled){background:#fdecec;color:#c62828}.editor-toolbar .tb-dropdown-menu button:disabled{opacity:.4;cursor:default}.editor-toolbar .tb-dropdown-separator{height:1px;margin:4px 2px;background:var(--es-editor-border)}.editor-toolbar .divider{width:1px;height:20px;background:var(--es-editor-border);margin:0 6px}.ProseMirror{min-height:60px;padding:12px;outline:none;font-size:16px;line-height:1.7;color:#1f1f1f;caret-color:#2563eb}.ProseMirror h1,.ProseMirror h2,.ProseMirror h3{line-height:1.2;margin-top:.8em;margin-bottom:.4em;font-weight:700;letter-spacing:-.02em}.ProseMirror h1{font-size:2rem}.ProseMirror h2{font-size:1.5rem}.ProseMirror h3{font-size:1.25rem}.ProseMirror p{margin:0}.ProseMirror ul,.ProseMirror ol{padding-left:1.5rem;margin:5px 0;display:flow-root}.ProseMirror li{margin:0}.ProseMirror blockquote{margin:1.4rem 0;padding-left:1rem;border-left:4px solid #c7d2fe;color:#555}.ProseMirror code{background:#f3f4f6;color:#d63384;padding:.15em .35em;border-radius:4px;font-size:.92em}.ProseMirror pre{background:#1f2937;color:#f9fafb;padding:16px 18px;border-radius:10px;overflow-x:auto;margin:1.2rem 0}.ProseMirror pre code{background:transparent;color:inherit;padding:0}.ProseMirror a{color:#2563eb;text-decoration:underline}.ProseMirror hr{border:none;border-top:1px solid #e2e2e2;margin:2rem 0}.ProseMirror table{width:100%;border-collapse:collapse;margin:1.2rem 0}.ProseMirror th,.ProseMirror td{border:1px solid #ddd;padding:5px;position:relative}.ProseMirror th{background:#f5f5f5;text-align:left}.ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:col-resize;background:transparent;z-index:20}.ProseMirror ::selection{background:#6082ff40}.suggestion-popup{display:flex;flex-direction:column;min-width:220px;padding:6px;background:#fff;z-index:99999999;border:1px solid #e5e5e5;border-radius:10px;box-shadow:0 12px 30px #00000014,0 2px 8px #0000000d}.suggestion-popup button{border:none;background:transparent;border-radius:8px;padding:8px 10px;text-align:left;cursor:pointer;font-size:14px}.suggestion-popup button:hover,.suggestion-popup button.is-selected{background:#eef2ff}.mention{display:inline-flex;align-items:center;background:#eef2ff;color:#304ffe;padding:2px 6px;border-radius:5px;font-weight:500}.img-wrapper{position:relative;display:inline-block;margin:12px 0}.img-wrapper img{max-width:100%;border-radius:10px;transition:opacity .2s ease}.img-wrapper.ProseMirror-selectednode img{outline:2px solid var(--es-editor-accent, #2342c0);outline-offset:2px}.img-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:2px;background:#fffffff5;border:1px solid var(--es-editor-border, #e2e4e9);border-radius:8px;padding:3px;box-shadow:0 8px 20px #00000014;opacity:0;pointer-events:none;transition:opacity .12s ease}.img-toolbar.readonly{display:none}.img-wrapper:hover .img-toolbar,.img-wrapper.ProseMirror-selectednode .img-toolbar{opacity:1;pointer-events:auto}.img-toolbar button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--es-editor-icon, #4b5563);cursor:pointer}.img-toolbar button:hover{background:var(--es-editor-hover, #eef0f3)}.img-toolbar button.is-active{background:var(--es-editor-accent-soft, #e5ebff);color:var(--es-editor-accent, #2342c0)}.img-toolbar button.danger:hover{background:#fdecec;color:#c62828}.img-toolbar svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.img-toolbar-divider{width:1px;height:16px;margin:0 3px;background:var(--es-editor-border, #e2e4e9)}.img-resize-handle{position:absolute;right:-5px;bottom:-5px;width:12px;height:12px;background:#fff;border:2px solid var(--es-editor-accent, #2342c0);border-radius:3px;box-shadow:0 1px 3px #0003;cursor:se-resize;opacity:0;transition:opacity .12s ease}.img-resize-handle.readonly{display:none}.img-wrapper:hover .img-resize-handle,.img-wrapper.ProseMirror-selectednode .img-resize-handle{opacity:1}\n"] }]
686
+ }], propDecorators: { element: [{ type: i0.ViewChild, args: ["element", { isSignal: true }] }], EmojiSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "EmojiSupport", required: false }] }], BulletListSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "BulletListSupport", required: false }] }], TablesSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "TablesSupport", required: false }] }], Mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "Mode", required: true }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], MentionEntities: [{ type: i0.Input, args: [{ isSignal: true, alias: "MentionEntities", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], tableMenuRef: [{ type: i0.ViewChild, args: ["tableMenu", { isSignal: true }] }], inputChange: [{
559
687
  type: Output
560
688
  }], inputFocus: [{
561
689
  type: Output
562
690
  }], inputFinalized: [{
563
691
  type: Output
692
+ }], onDocumentMouseDown: [{
693
+ type: HostListener,
694
+ args: ["document:mousedown", ["$event"]]
695
+ }], closeTableMenu: [{
696
+ type: HostListener,
697
+ args: ["document:keydown.escape"]
564
698
  }] } });
699
+ const EMPTY_TOOLBAR_STATE = {
700
+ block: "paragraph", fontFamily: "", fontSize: "",
701
+ bold: false, italic: false, underline: false, bulletList: false,
702
+ inTable: false, canUndo: false, canRedo: false,
703
+ };
704
+ // Confronta due font-family sul primo font dell'elenco: il browser riscrive le virgolette
705
+ // in fase di parsing ('Times New Roman' -> "Times New Roman"), quindi le stringhe intere non coincidono
706
+ function sameFontFamily(a, b) {
707
+ const first = (f) => (f || "").split(",")[0].trim().replace(/^['"]|['"]$/g, "").toLowerCase();
708
+ return !!first(a) && first(a) === first(b);
709
+ }
565
710
 
566
711
  const TXE_DEBUG = new InjectionToken('TXE_DEBUG');
567
712
 
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-text-editors.mjs","sources":["../../../projects/text-editors/src/lib/editor/extensions/CustomMention.ts","../../../projects/text-editors/src/lib/editor/extensions/CustomeImageWithView.ts","../../../projects/text-editors/src/lib/editor/extensions/FontFamily.ts","../../../projects/text-editors/src/lib/editor/extensions/LineHeight.ts","../../../projects/text-editors/src/lib/editor/extensions/Suggestion.ts","../../../projects/text-editors/src/lib/editor/extensions/FontSize.ts","../../../projects/text-editors/src/lib/editor/editor.component.ts","../../../projects/text-editors/src/lib/editor/editor.component.html","../../../projects/text-editors/src/lib/tokens.ts","../../../projects/text-editors/src/public-api.ts","../../../projects/text-editors/src/esfaenza-text-editors.ts"],"sourcesContent":["import Mention from '@tiptap/extension-mention'\r\nimport { marked } from 'marked'\r\n\r\nexport const CustomMention = Mention.extend({\r\n renderMarkdown(node) { return `@${node.attrs?.id || node.attrs?.label}` },\r\n parseMarkdown(token) { return { type: token.type, attrs: { id: token.text, label: token.text } } },\r\n});\r\n\r\nmarked.use({\r\n extensions: [\r\n {\r\n name: 'mention',\r\n level: 'inline',\r\n\r\n start(src) {\r\n const match = /(^|\\s)@/.exec(src)\r\n return match ? match.index + match[1].length : undefined\r\n },\r\n\r\n tokenizer(src) {\r\n const match = /^@([a-zA-Z]+)(?=\\s|:|$)/.exec(src)\r\n if (match && match[1].length == 7)\r\n return { type: 'mention', raw: match[0], text: match[1] }\r\n },\r\n\r\n renderer(token) { return token.raw },\r\n },\r\n ],\r\n})\r\n\r\nexport const mymarked = marked;\r\n","import { Image } from '@tiptap/extension-image'\r\nimport { Plugin } from '@tiptap/pm/state'\r\n\r\nlet handleFiles = async (view: any, files: FileList | undefined) => {\r\n\r\n const file = Array.from(files || []).find(f => f.type.startsWith('image/'));\r\n\r\n if (!file) return;\r\n\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n\r\n const base64 = reader.result as string;\r\n const img = new window.Image();\r\n img.onload = () => {\r\n const { schema } = view.state;\r\n const node = schema.nodes.image.create({ src: base64, width: img.naturalWidth, float: \"none\" });\r\n const tr = view.state.tr.replaceSelectionWith(node);\r\n view.dispatch(tr);\r\n }\r\n img.src = base64;\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n}\r\n\r\nconst CustomImage = Image.extend({\r\n draggable: true,\r\n selectable: true,\r\n addAttributes() {\r\n return {\r\n ...this.parent?.(),\r\n width: { default: null, },\r\n float: { default: \"none\" }, // 'left' | 'right' | 'none'\r\n src: {\r\n default: null,\r\n parseHTML: element => { return element.getAttribute('src') },\r\n renderHTML: attributes => { return { src: attributes.src, } },\r\n },\r\n };\r\n },\r\n renderMarkdown(node, _) {\r\n const src = node.attrs?.src\r\n const width = node.attrs?.width\r\n const float = node.attrs?.float\r\n\r\n // fallback to normal markdown when possible\r\n if ((!width || width === 'auto') && float === 'none') {\r\n return `![image](${src})`\r\n }\r\n\r\n // otherwise emit raw HTML\r\n const style = float === 'left' ? 'float:left; margin-right:10px;' : float === 'right' ? 'float:right; margin-left:10px;' : '';\r\n return `<img src=\"${src}\" width=\"${width || ''}\" style=\"${style}\" />`\r\n },\r\n\r\n parseMarkdown(token, helpers) {\r\n return helpers.createNode(\"image\", { src: token[\"href\"] || token[\"src\"], alt: token.content, float: token['float'] || 'none' })\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n const { float } = HTMLAttributes\r\n let style = ''\r\n if (float === 'left')\r\n style = 'float:left; display:block; margin-right: 10px'\r\n else if (float === 'right')\r\n style = 'float:right; display:block; margin-left: 10px'\r\n else\r\n style = `display: inline-block; float: none; vertical-align: middle;`\r\n\r\n return ['img', { ...HTMLAttributes, style }]\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'img[src]',\r\n getAttrs: element => {\r\n const el = element as HTMLImageElement;\r\n const src = el.getAttribute('src')\r\n\r\n if (!src) return false\r\n\r\n // allow both normal URLs AND base64\r\n if (src.startsWith('http') || src.startsWith('data:image'))\r\n return { src, float: el.style.float || null, width: el.style.width ? parseInt(el.style.width) : null, }\r\n\r\n return false\r\n },\r\n },\r\n ]\r\n },\r\n addProseMirrorPlugins: () => {\r\n return [\r\n new Plugin({\r\n props: {\r\n handleDrop: (view, event) => {\r\n const files = event.dataTransfer?.files;\r\n if (!files?.length) return false;\r\n\r\n handleFiles(view, files);\r\n\r\n return true;\r\n },\r\n\r\n handlePaste: (view, event) => {\r\n const files = event.clipboardData?.files;\r\n if (!files?.length) return false;\r\n\r\n handleFiles(view, files);\r\n\r\n return true;\r\n },\r\n },\r\n })\r\n ]\r\n },\r\n});\r\n\r\nconst CustomImageWithView = CustomImage.extend({\r\n addNodeView: () => {\r\n return ({ node, getPos, editor }) => {\r\n\r\n let updateImage = (img: HTMLImageElement, node: any) => {\r\n img.draggable = false;\r\n img.src = node.attrs.src\r\n img.style.width = node.attrs.width ? `${node.attrs.width}px` : '';\r\n if (node.attrs.float === 'left' || node.attrs.float === 'right') {\r\n img.style.display = 'block'\r\n if (node.attrs.float === 'left')\r\n img.style.margin = \"0 10px 0 0\";\r\n else if (node.attrs.float === 'right')\r\n img.style.margin = \"0 0 0 10px\"\r\n } else {\r\n img.style.display = 'inline-block'\r\n img.style.verticalAlign = 'middle'\r\n }\r\n };\r\n\r\n let updateWrapper = (wrapper: HTMLDivElement, node: any) => {\r\n wrapper.draggable = true;\r\n wrapper.contentEditable = \"false\";\r\n\r\n wrapper.className = `img-wrapper`;\r\n wrapper.style.float = node.attrs.float;\r\n\r\n if (node.attrs.float === 'left' || node.attrs.float === 'right') {\r\n wrapper.style.width = \"auto\";\r\n wrapper.style.textAlign = \"auto\";\r\n }\r\n else {\r\n wrapper.style.width = \"100%\";\r\n wrapper.style.textAlign = \"center\";\r\n }\r\n }\r\n\r\n const wrapper = document.createElement('div')\r\n updateWrapper(wrapper, node);\r\n\r\n const img = document.createElement('img')\r\n updateImage(img, node);\r\n\r\n const toolbar = document.createElement('div')\r\n toolbar.className = `img-toolbar ${editor.isEditable ? '' : 'readonly'}`;\r\n\r\n const btn = (t: any, fn: any) => {\r\n const b = document.createElement('button');\r\n b.type = \"button\";\r\n b.textContent = t;\r\n b.onclick = fn;\r\n return b;\r\n }\r\n\r\n toolbar.append(\r\n\r\n btn('Centro', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos()!, undefined, { ...node.attrs, ...{ float: 'none' } }))),\r\n btn('Sinistra', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos()!, undefined, { ...node.attrs, ...{ float: 'left' } }))),\r\n btn('Destra', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos()!, undefined, { ...node.attrs, ...{ float: 'right' } }))),\r\n\r\n btn('Elimina', () => {\r\n const nodePos = getPos()!;\r\n editor.view.dispatch(editor.view.state.tr.delete(nodePos, nodePos + node.nodeSize))\r\n }));\r\n\r\n // resize\r\n let startX = 0;\r\n let startW = 0;\r\n\r\n const handle = document.createElement('div');\r\n handle.className = `img-resize-handle ${editor.isEditable ? '' : 'readonly'}`;\r\n\r\n handle.onmousedown = (e) => {\r\n startX = e.clientX\r\n startW = img.offsetWidth\r\n\r\n let latestWidth: number | null = null\r\n let ticking = false\r\n\r\n const move = (e: any) => {\r\n latestWidth = Math.max(80, startW + (e.clientX - startX));\r\n\r\n if (!ticking) {\r\n ticking = true\r\n\r\n requestAnimationFrame(() => {\r\n const nodePos = getPos()!;\r\n editor.view.dispatch(editor.view.state.tr.setNodeMarkup(nodePos, undefined, { ...node.attrs, width: latestWidth }))\r\n ticking = false\r\n });\r\n }\r\n }\r\n\r\n const up = () => {\r\n window.removeEventListener('mousemove', move);\r\n window.removeEventListener('mouseup', up);\r\n }\r\n\r\n window.addEventListener('mousemove', move);\r\n window.addEventListener('mouseup', up);\r\n\r\n // Per evitare che si attivi il drag dell'elemento sotto. Dal resizer si usa solo il resizer\r\n e.preventDefault();\r\n }\r\n\r\n wrapper.append(img, toolbar, handle);\r\n\r\n return {\r\n dom: wrapper,\r\n destroy() { wrapper.remove() },\r\n update(updatedNode) {\r\n\r\n // different node type -> recreate NodeView\r\n if (updatedNode.type !== node.type)\r\n return false\r\n\r\n node = updatedNode\r\n updateImage(img, node);\r\n updateWrapper(wrapper, node);\r\n\r\n return true\r\n },\r\n };\r\n }\r\n },\r\n});\r\n\r\nexport default CustomImageWithView;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst FontFamily = Extension.create({\r\n name: 'fontFamily',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['textStyle'],\r\n attributes: {\r\n fontFamily: {\r\n default: null,\r\n parseHTML: element => element.style.fontFamily,\r\n renderHTML: attributes => {\r\n if (!attributes.fontFamily) return {};\r\n return { style: `font-family: ${attributes.fontFamily}` };\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setFontFamily: (fontFamily: string) => ({ chain }) => { return chain().setMark('textStyle', { fontFamily }).run(); },\r\n unsetFontFamily: () => ({ chain }) => { return chain().setMark('textStyle', { fontFamily: null, }).removeEmptyTextStyle().run() },\r\n }\r\n },\r\n});\r\n\r\nexport default FontFamily;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst LineHeight = Extension.create({\r\n name: 'lineHeight',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['paragraph', 'heading'],\r\n attributes: {\r\n lineHeight: {\r\n default: null,\r\n parseHTML: element => element.style.lineHeight,\r\n renderHTML: attributes => {\r\n if (!attributes.lineHeight) return {};\r\n return { style: `line-height: ${attributes.lineHeight}` };\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setLineHeight: (lineHeight: string) => ({ commands }) => { return commands.updateAttributes('paragraph', { lineHeight }) },\r\n unsetLineHeight: () => ({ commands }) => { return commands.updateAttributes('paragraph', { lineHeight: null }) },\r\n }\r\n },\r\n});\r\n\r\nexport default LineHeight;","let Suggestion = (choiches: { id: string, description: string }[]) => {\r\n \r\n\r\n return {\r\n char: '@',\r\n\r\n items: ({ query }: { query: string }) => {\r\n return choiches.filter(item => item.description.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5);\r\n },\r\n\r\n render: () => {\r\n let popup: HTMLDivElement;\r\n let selectedIndex = 0\r\n let currentProps: any\r\n\r\n return {\r\n onStart: (props: any) => {\r\n popup = document.createElement('div')\r\n popup.classList.add('suggestion-popup')\r\n\r\n document.body.appendChild(popup)\r\n\r\n currentProps = props;\r\n updatePopup();\r\n },\r\n onKeyDown(props: any) {\r\n if (props.event.key === 'ArrowUp') {\r\n selectedIndex = (selectedIndex + currentProps.items.length - 1) % currentProps.items.length\r\n updatePopup()\r\n return true\r\n }\r\n\r\n if (props.event.key === 'ArrowDown') {\r\n selectedIndex = (selectedIndex + 1) % currentProps.items.length\r\n updatePopup()\r\n return true\r\n }\r\n\r\n if (props.event.key === 'Enter') {\r\n selectItem()\r\n return true\r\n }\r\n\r\n return false\r\n },\r\n onUpdate(props: any) { \r\n currentProps = props;\r\n updatePopup();\r\n },\r\n onExit() { popup.remove(); },\r\n }\r\n\r\n function updatePopup() {\r\n if (!currentProps.clientRect)\r\n return\r\n\r\n popup.innerHTML = '';\r\n\r\n currentProps.items.forEach((item: { id: string, description: string }, index: number) => {\r\n const button = document.createElement('button')\r\n\r\n button.textContent = item.description\r\n\r\n if (index === selectedIndex)\r\n button.classList.add('is-selected')\r\n\r\n button.addEventListener('click', () => {\r\n selectedIndex = index\r\n selectItem()\r\n })\r\n\r\n popup.appendChild(button)\r\n });\r\n\r\n const rect = currentProps.clientRect();\r\n popup.style.position = 'fixed'\r\n popup.style.left = `${rect.left}px`\r\n popup.style.top = `${rect.bottom + 5}px`\r\n }\r\n\r\n function selectItem() {\r\n const item = currentProps.items[selectedIndex]\r\n\r\n if (item)\r\n currentProps.command({ id: item.id, description: item.description, });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Suggestion;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst FontSize = Extension.create({\r\n name: 'fontSize',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['textStyle'],\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: element => {\r\n const size = element.style.fontSize;\r\n if (!size) return null;\r\n // normalize pt → px\r\n if (size.endsWith('pt'))\r\n return `${Math.round(parseFloat(size) * 1.333)}px`;\r\n return size;\r\n },\r\n renderHTML: attributes => {\r\n if (!attributes.fontSize) return {};\r\n\r\n return { style: `font-size: ${attributes.fontSize}` }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setFontSize: (fontSize: string) => ({ chain }) => { return chain().setMark('textStyle', { fontSize }).run() },\r\n unsetFontSize: () => ({ chain }) => { return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run() },\r\n }\r\n },\r\n})\r\n\r\nexport default FontSize;","import { CommonModule } from \"@angular/common\";\r\nimport { booleanAttribute, Component, ElementRef, EventEmitter, forwardRef, input, Output, viewChild, ViewEncapsulation } from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from \"@angular/forms\";\r\n\r\nimport { Editor } from '@tiptap/core'\r\nimport { Markdown } from '@tiptap/markdown'\r\nimport { StarterKit } from '@tiptap/starter-kit'\r\nimport { TextStyle } from '@tiptap/extension-text-style'\r\nimport { Color } from '@tiptap/extension-color'\r\nimport { Table } from '@tiptap/extension-table'\r\nimport { TableRow } from '@tiptap/extension-table-row'\r\nimport { TableCell } from '@tiptap/extension-table-cell'\r\nimport { TableHeader } from '@tiptap/extension-table-header'\r\nimport { TextAlign } from '@tiptap/extension-text-align'\r\n\r\nimport { CustomMention, mymarked } from \"./extensions/CustomMention\";\r\nimport CustomImageWithView from \"./extensions/CustomeImageWithView\";\r\nimport FontFamily from \"./extensions/FontFamily\";\r\nimport LineHeight from \"./extensions/LineHeight\";\r\nimport Suggestion from \"./extensions/Suggestion\";\r\nimport FontSize from \"./extensions/FontSize\";\r\n\r\n@Component({\r\n selector: \"es-editor\",\r\n templateUrl: \"./editor.component.html\",\r\n styleUrls: [\"./editor.component.scss\"],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => EditorComponent), multi: true },\r\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => EditorComponent), multi: true }\r\n ]\r\n})\r\nexport class EditorComponent implements ControlValueAccessor, Validator {\r\n\r\n protected onChange = (_: any) => { };\r\n public onTouched = () => { };\r\n public registerOnChange(fn: any): void { this.onChange = fn; }\r\n public registerOnTouched(fn: any): void { this.onTouched = fn; }\r\n\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n return null;\r\n }\r\n\r\n private element = viewChild.required<ElementRef<HTMLDivElement>>(\"element\");\r\n\r\n public EmojiSupport = input<boolean>(false);\r\n public BulletListSupport = input<boolean>(false);\r\n public TablesSupport = input<boolean>(false);\r\n public Mode = input.required<'html' | 'markdown' | 'text'>();\r\n public readonly = input(false, { transform: booleanAttribute });\r\n public disabled = input(false, { transform: booleanAttribute });\r\n public required = input(false, { transform: booleanAttribute });\r\n public style = input(\"\");\r\n\r\n public MentionEntities = input<{ id: string, description: string }[]>([]);\r\n\r\n public name = input.required<string>();\r\n\r\n private EditorRef?: Editor;\r\n public value: any;\r\n\r\n @Output() inputChange: EventEmitter<string> = new EventEmitter<string>();\r\n @Output() inputFocus: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() inputFinalized: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n ngOnInit() {\r\n let config = [];\r\n\r\n config.push(...[\r\n StarterKit,\r\n TextStyle,\r\n Color,\r\n FontSize,\r\n FontFamily,\r\n LineHeight,\r\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\r\n CustomImageWithView\r\n ]);\r\n\r\n if (this.Mode() == \"markdown\")\r\n config.push(Markdown.configure({ marked: mymarked }));\r\n\r\n if (this.Mode() == \"html\") {\r\n if (this.TablesSupport())\r\n config.push(...[Table.configure({ lastColumnResizable: true, resizable: true }), TableRow, TableHeader, TableCell]);\r\n }\r\n\r\n if ((this.MentionEntities()?.length || 0) > 0)\r\n config.push(CustomMention.configure({\r\n deleteTriggerWithBackspace: true,\r\n HTMLAttributes: { class: 'mention' },\r\n renderText({ options, node }) { return `${options.suggestion.char}${node.attrs.description ?? node.attrs.id}` },\r\n suggestion: Suggestion(this.MentionEntities()),\r\n }),);\r\n\r\n this.EditorRef = new Editor({\r\n element: this.element().nativeElement,\r\n extensions: config,\r\n editable: !this.readonly(),\r\n onUpdate: (_) => {\r\n let value = \"\";\r\n switch (this.Mode()) {\r\n case \"html\":\r\n value = this.EditorRef?.getHTML() || \"\";\r\n // Emissione del valore vuoto trimmato per bene\r\n if (value.trim() === \"<p></p>\")\r\n value = \"\";\r\n break;\r\n case \"markdown\": value = this.EditorRef?.getMarkdown() || \"\"; break;\r\n case \"text\": value = this.EditorRef?.getText() || \"\"; break;\r\n }\r\n\r\n this.onChange(value);\r\n }\r\n });\r\n }\r\n\r\n public async writeValue(obj: any): Promise<void> {\r\n // Coercizione di tutti i valori \"vuoti\" all'unico \"null\"\r\n if (obj === null || obj === undefined) obj = null;\r\n\r\n this.value = obj;\r\n\r\n // normalizzazione per la firma di merda di CEA\r\n this.value = this.value?.replace(/^\\*\\*\\*\\*\\*\\*\\s\\s/g, '') || \"\"\r\n this.value = this.value?.replace(/^\\*\\*\\s\\s/g, '') || \"\"\r\n\r\n this.EditorRef?.commands.clearContent();\r\n if (this.Mode() === \"markdown\")\r\n this.EditorRef?.commands.setContent(this.value, { contentType: \"markdown\" });\r\n else if (this.Mode() === \"html\")\r\n this.EditorRef?.commands.setContent(this.value, { contentType: \"html\" });\r\n else\r\n this.EditorRef?.commands.insertContent(this.value);\r\n }\r\n\r\n setTypography(selectElement: Event) {\r\n const select = selectElement.target as HTMLSelectElement\r\n switch (select.value) {\r\n case \"paragraph\": this.EditorRef?.chain().focus().setParagraph().run(); break;\r\n default: this.EditorRef?.chain().focus().setHeading({ level: parseInt(select.value.charAt(1)) as any }).run(); break;\r\n }\r\n select.value = \"\";\r\n }\r\n setBold() {\r\n this.EditorRef?.chain().focus().toggleBold().run();\r\n }\r\n setItalic() {\r\n this.EditorRef?.chain().focus().toggleItalic().run();\r\n }\r\n setUnderlined() {\r\n this.EditorRef?.chain().focus().toggleUnderline().run();\r\n }\r\n setBulletList() {\r\n this.EditorRef?.chain().focus().toggleBulletList().run();\r\n }\r\n undoAction() {\r\n this.EditorRef?.chain().focus().undo().run();\r\n }\r\n redoAction() {\r\n this.EditorRef?.chain().focus().redo().run();\r\n }\r\n addTable() {\r\n this.EditorRef?.chain().focus().insertTable({ rows: 1, cols: 2, withHeaderRow: false }).run()\r\n }\r\n deleteTable() {\r\n this.EditorRef?.chain().focus().deleteTable().run();\r\n }\r\n addRow() {\r\n this.EditorRef?.chain().focus().addRowAfter().run();\r\n }\r\n deleteRow() {\r\n this.EditorRef?.chain().focus().deleteRow().run();\r\n }\r\n addColumn() {\r\n this.EditorRef?.chain().focus().addColumnAfter().run();\r\n }\r\n deleteColumn() {\r\n this.EditorRef?.chain().focus().deleteColumn().run();\r\n }\r\n setEmoji(selectElement: Event) {\r\n const select = selectElement.target as HTMLSelectElement;\r\n this.EditorRef?.chain().focus().insertContent(select.value).run();\r\n select.value = \"\";\r\n }\r\n}","<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <div class=\"editor-toolbar\">\r\n\r\n <!-- Typography -->\r\n <select id=\"heading-select\" (change)=\"setTypography($event)\">\r\n <option value=\"\" selected hidden>Pragrafo</option>\r\n <option value=\"paragraph\">Pragrafo</option>\r\n <option value=\"h1\">Intestazione 1</option>\r\n <option value=\"h2\">Intestazione 2</option>\r\n <option value=\"h3\">Intestazione 3</option>\r\n <option value=\"h4\">Intestazione 4</option>\r\n <option value=\"h5\">Intestazione 5</option>\r\n <option value=\"h6\">Intestazione 6</option>\r\n </select>\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" (click)=\"setBold()\"><b>B</b></button>\r\n <button type=\"button\" (click)=\"setItalic()\"><i>I</i></button>\r\n <button type=\"button\" (click)=\"setUnderlined()\"><u>U</u></button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" (click)=\"setBulletList()\">• Lista</button>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n @if(Mode() == \"html\" && TablesSupport())\r\n {\r\n <button type=\"button\" (click)=\"addTable()\">⊞<span style=\"font-size: 10px;\">✚</span></button>\r\n <button type=\"button\" (click)=\"deleteTable()\">⊞<span style=\"font-size: 10px;\">▬</span></button>\r\n <button type=\"button\" (click)=\"addRow()\">🖨<span style=\"font-size: 10px;\">✚</span></button>\r\n <button type=\"button\" (click)=\"deleteRow()\">🖨<span style=\"font-size: 10px;\">▬</span></button>\r\n <button type=\"button\" (click)=\"addColumn()\">🗄<span style=\"font-size: 10px;\">✚</span></button>\r\n <button type=\"button\" (click)=\"deleteColumn()\">🗄<span style=\"font-size: 10px;\">▬</span></button>\r\n <div class=\"divider\"></div>\r\n }\r\n\r\n <!-- History -->\r\n <button type=\"button\" (click)=\"undoAction()\">↶</button>\r\n <button type=\"button\" (click)=\"redoAction()\">↷</button>\r\n\r\n @if(EmojiSupport()){\r\n <select id=\"emoji-select\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>😊</option>\r\n <option value=\"😊\">😊</option>\r\n <option value=\"😀\">😀</option>\r\n <option value=\"😂\">😂</option>\r\n <option value=\"🔥\">🔥</option>\r\n <option value=\"🎉\">🎉</option>\r\n <option value=\"🚀\">🚀</option>\r\n <option value=\"❤️\">❤️</option>\r\n <option value=\"👍\">👍</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const TXE_DEBUG = new InjectionToken<boolean>('TXE_DEBUG');","/*\r\n * Public API Surface of text-editors\r\n */\r\n\r\nexport * from './lib/editor/editor.component';\r\n\r\nexport * from \"./lib/tokens\"","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-text-editors.mjs","sources":["../../../projects/text-editors/src/lib/editor/extensions/CustomMention.ts","../../../projects/text-editors/src/lib/editor/extensions/CustomeImageWithView.ts","../../../projects/text-editors/src/lib/editor/extensions/FontFamily.ts","../../../projects/text-editors/src/lib/editor/extensions/LineHeight.ts","../../../projects/text-editors/src/lib/editor/extensions/Suggestion.ts","../../../projects/text-editors/src/lib/editor/extensions/FontSize.ts","../../../projects/text-editors/src/lib/editor/editor.component.ts","../../../projects/text-editors/src/lib/editor/editor.component.html","../../../projects/text-editors/src/lib/tokens.ts","../../../projects/text-editors/src/public-api.ts","../../../projects/text-editors/src/esfaenza-text-editors.ts"],"sourcesContent":["import Mention from '@tiptap/extension-mention'\r\nimport { marked } from 'marked'\r\n\r\nexport const CustomMention = Mention.extend({\r\n renderMarkdown(node) { return `@${node.attrs?.id || node.attrs?.label}` },\r\n parseMarkdown(token) { return { type: token.type, attrs: { id: token.text, label: token.text } } },\r\n});\r\n\r\nmarked.use({\r\n extensions: [\r\n {\r\n name: 'mention',\r\n level: 'inline',\r\n\r\n start(src) {\r\n const match = /(^|\\s)@/.exec(src)\r\n return match ? match.index + match[1].length : undefined\r\n },\r\n\r\n tokenizer(src) {\r\n const match = /^@([a-zA-Z]+)(?=\\s|:|$)/.exec(src)\r\n if (match && match[1].length == 7)\r\n return { type: 'mention', raw: match[0], text: match[1] }\r\n },\r\n\r\n renderer(token) { return token.raw },\r\n },\r\n ],\r\n})\r\n\r\nexport const mymarked = marked;\r\n","import { Image } from '@tiptap/extension-image'\r\nimport { Plugin } from '@tiptap/pm/state'\r\n\r\nlet handleFiles = async (view: any, files: FileList | undefined) => {\r\n\r\n const file = Array.from(files || []).find(f => f.type.startsWith('image/'));\r\n\r\n if (!file) return;\r\n\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n\r\n const base64 = reader.result as string;\r\n const img = new window.Image();\r\n img.onload = () => {\r\n const { schema } = view.state;\r\n const node = schema.nodes.image.create({ src: base64, width: img.naturalWidth, float: \"none\" });\r\n const tr = view.state.tr.replaceSelectionWith(node);\r\n view.dispatch(tr);\r\n }\r\n img.src = base64;\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n}\r\n\r\nconst CustomImage = Image.extend({\r\n draggable: true,\r\n selectable: true,\r\n addAttributes() {\r\n return {\r\n ...this.parent?.(),\r\n width: { default: null, },\r\n float: { default: \"none\" }, // 'left' | 'right' | 'none'\r\n src: {\r\n default: null,\r\n parseHTML: element => { return element.getAttribute('src') },\r\n renderHTML: attributes => { return { src: attributes.src, } },\r\n },\r\n };\r\n },\r\n renderMarkdown(node, _) {\r\n const src = node.attrs?.src\r\n const width = node.attrs?.width\r\n const float = node.attrs?.float\r\n\r\n // fallback to normal markdown when possible\r\n if ((!width || width === 'auto') && float === 'none') {\r\n return `![image](${src})`\r\n }\r\n\r\n // otherwise emit raw HTML\r\n const style = float === 'left' ? 'float:left; margin-right:10px;' : float === 'right' ? 'float:right; margin-left:10px;' : '';\r\n return `<img src=\"${src}\" width=\"${width || ''}\" style=\"${style}\" />`\r\n },\r\n\r\n parseMarkdown(token, helpers) {\r\n return helpers.createNode(\"image\", { src: token[\"href\"] || token[\"src\"], alt: token.content, float: token['float'] || 'none' })\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n const { float } = HTMLAttributes\r\n let style = ''\r\n if (float === 'left')\r\n style = 'float:left; display:block; margin-right: 10px'\r\n else if (float === 'right')\r\n style = 'float:right; display:block; margin-left: 10px'\r\n else\r\n style = `display: inline-block; float: none; vertical-align: middle;`\r\n\r\n return ['img', { ...HTMLAttributes, style }]\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'img[src]',\r\n getAttrs: element => {\r\n const el = element as HTMLImageElement;\r\n const src = el.getAttribute('src')\r\n\r\n if (!src) return false\r\n\r\n // allow both normal URLs AND base64\r\n if (src.startsWith('http') || src.startsWith('data:image'))\r\n return { src, float: el.style.float || null, width: el.style.width ? parseInt(el.style.width) : null, }\r\n\r\n return false\r\n },\r\n },\r\n ]\r\n },\r\n addProseMirrorPlugins: () => {\r\n return [\r\n new Plugin({\r\n props: {\r\n handleDrop: (view, event) => {\r\n const files = event.dataTransfer?.files;\r\n if (!files?.length) return false;\r\n\r\n handleFiles(view, files);\r\n\r\n return true;\r\n },\r\n\r\n handlePaste: (view, event) => {\r\n const files = event.clipboardData?.files;\r\n if (!files?.length) return false;\r\n\r\n handleFiles(view, files);\r\n\r\n return true;\r\n },\r\n },\r\n })\r\n ]\r\n },\r\n});\r\n\r\nconst CustomImageWithView = CustomImage.extend({\r\n addNodeView: () => {\r\n return ({ node, getPos, editor }) => {\r\n\r\n let updateImage = (img: HTMLImageElement, node: any) => {\r\n img.draggable = false;\r\n img.src = node.attrs.src\r\n img.style.width = node.attrs.width ? `${node.attrs.width}px` : '';\r\n if (node.attrs.float === 'left' || node.attrs.float === 'right') {\r\n img.style.display = 'block'\r\n if (node.attrs.float === 'left')\r\n img.style.margin = \"0 10px 0 0\";\r\n else if (node.attrs.float === 'right')\r\n img.style.margin = \"0 0 0 10px\"\r\n } else {\r\n img.style.display = 'inline-block'\r\n img.style.verticalAlign = 'middle'\r\n }\r\n };\r\n\r\n let updateWrapper = (wrapper: HTMLDivElement, node: any) => {\r\n wrapper.draggable = true;\r\n wrapper.contentEditable = \"false\";\r\n\r\n // classList e non className: non deve cancellare \"ProseMirror-selectednode\" messa da ProseMirror sull'immagine selezionata\r\n wrapper.classList.add(`img-wrapper`);\r\n wrapper.style.float = node.attrs.float;\r\n\r\n if (node.attrs.float === 'left' || node.attrs.float === 'right') {\r\n wrapper.style.width = \"auto\";\r\n wrapper.style.textAlign = \"auto\";\r\n }\r\n else {\r\n wrapper.style.width = \"100%\";\r\n wrapper.style.textAlign = \"center\";\r\n }\r\n }\r\n\r\n const wrapper = document.createElement('div')\r\n updateWrapper(wrapper, node);\r\n\r\n const img = document.createElement('img')\r\n updateImage(img, node);\r\n\r\n const toolbar = document.createElement('div')\r\n toolbar.className = `img-toolbar ${editor.isEditable ? '' : 'readonly'}`;\r\n\r\n const btn = (title: string, icon: string, fn: any) => {\r\n const b = document.createElement('button');\r\n b.type = \"button\";\r\n b.title = title;\r\n b.setAttribute(\"aria-label\", title);\r\n b.innerHTML = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"${icon}\" /></svg>`;\r\n b.onclick = fn;\r\n return b;\r\n }\r\n\r\n const setFloat = (float: string) => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos()!, undefined, { ...node.attrs, ...{ float } }));\r\n\r\n // Pulsanti di allineamento, indicizzati per valore di \"float\" per evidenziare quello attivo\r\n const alignButtons: Record<string, HTMLButtonElement> = {\r\n left: btn('Allinea a sinistra', 'M15 12H3M17 18H3M21 6H3', () => setFloat('left')),\r\n none: btn('Centra', 'M17 12H7M19 18H5M21 6H3', () => setFloat('none')),\r\n right: btn('Allinea a destra', 'M21 12H9M21 18H7M21 6H3', () => setFloat('right')),\r\n };\r\n\r\n const separator = document.createElement('span');\r\n separator.className = 'img-toolbar-divider';\r\n\r\n const deleteButton = btn('Elimina immagine', 'M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M10 11v6M14 11v6', () => {\r\n const nodePos = getPos()!;\r\n editor.view.dispatch(editor.view.state.tr.delete(nodePos, nodePos + node.nodeSize))\r\n });\r\n deleteButton.classList.add('danger');\r\n\r\n toolbar.append(alignButtons['left'], alignButtons['none'], alignButtons['right'], separator, deleteButton);\r\n\r\n const updateToolbar = (node: any) => {\r\n const float = node.attrs.float === 'left' || node.attrs.float === 'right' ? node.attrs.float : 'none';\r\n Object.entries(alignButtons).forEach(([key, b]) => b.classList.toggle('is-active', key === float));\r\n }\r\n updateToolbar(node);\r\n\r\n // resize\r\n let startX = 0;\r\n let startW = 0;\r\n\r\n const handle = document.createElement('div');\r\n handle.className = `img-resize-handle ${editor.isEditable ? '' : 'readonly'}`;\r\n\r\n handle.onmousedown = (e) => {\r\n startX = e.clientX\r\n startW = img.offsetWidth\r\n\r\n let latestWidth: number | null = null\r\n let ticking = false\r\n\r\n const move = (e: any) => {\r\n latestWidth = Math.max(80, startW + (e.clientX - startX));\r\n\r\n if (!ticking) {\r\n ticking = true\r\n\r\n requestAnimationFrame(() => {\r\n const nodePos = getPos()!;\r\n editor.view.dispatch(editor.view.state.tr.setNodeMarkup(nodePos, undefined, { ...node.attrs, width: latestWidth }))\r\n ticking = false\r\n });\r\n }\r\n }\r\n\r\n const up = () => {\r\n window.removeEventListener('mousemove', move);\r\n window.removeEventListener('mouseup', up);\r\n }\r\n\r\n window.addEventListener('mousemove', move);\r\n window.addEventListener('mouseup', up);\r\n\r\n // Per evitare che si attivi il drag dell'elemento sotto. Dal resizer si usa solo il resizer\r\n e.preventDefault();\r\n }\r\n\r\n wrapper.append(img, toolbar, handle);\r\n\r\n return {\r\n dom: wrapper,\r\n destroy() { wrapper.remove() },\r\n update(updatedNode) {\r\n\r\n // different node type -> recreate NodeView\r\n if (updatedNode.type !== node.type)\r\n return false\r\n\r\n node = updatedNode\r\n updateImage(img, node);\r\n updateWrapper(wrapper, node);\r\n updateToolbar(node);\r\n\r\n return true\r\n },\r\n };\r\n }\r\n },\r\n});\r\n\r\nexport default CustomImageWithView;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst FontFamily = Extension.create({\r\n name: 'fontFamily',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['textStyle'],\r\n attributes: {\r\n fontFamily: {\r\n default: null,\r\n parseHTML: element => element.style.fontFamily,\r\n renderHTML: attributes => {\r\n if (!attributes.fontFamily) return {};\r\n return { style: `font-family: ${attributes.fontFamily}` };\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setFontFamily: (fontFamily: string) => ({ chain }) => { return chain().setMark('textStyle', { fontFamily }).run(); },\r\n unsetFontFamily: () => ({ chain }) => { return chain().setMark('textStyle', { fontFamily: null, }).removeEmptyTextStyle().run() },\r\n }\r\n },\r\n});\r\n\r\nexport default FontFamily;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst LineHeight = Extension.create({\r\n name: 'lineHeight',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['paragraph', 'heading'],\r\n attributes: {\r\n lineHeight: {\r\n default: null,\r\n parseHTML: element => element.style.lineHeight,\r\n renderHTML: attributes => {\r\n if (!attributes.lineHeight) return {};\r\n return { style: `line-height: ${attributes.lineHeight}` };\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setLineHeight: (lineHeight: string) => ({ commands }) => { return commands.updateAttributes('paragraph', { lineHeight }) },\r\n unsetLineHeight: () => ({ commands }) => { return commands.updateAttributes('paragraph', { lineHeight: null }) },\r\n }\r\n },\r\n});\r\n\r\nexport default LineHeight;","let Suggestion = (choiches: { id: string, description: string }[]) => {\r\n \r\n\r\n return {\r\n char: '@',\r\n\r\n items: ({ query }: { query: string }) => {\r\n return choiches.filter(item => item.description.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5);\r\n },\r\n\r\n render: () => {\r\n let popup: HTMLDivElement;\r\n let selectedIndex = 0\r\n let currentProps: any\r\n\r\n return {\r\n onStart: (props: any) => {\r\n popup = document.createElement('div')\r\n popup.classList.add('suggestion-popup')\r\n\r\n document.body.appendChild(popup)\r\n\r\n currentProps = props;\r\n updatePopup();\r\n },\r\n onKeyDown(props: any) {\r\n if (props.event.key === 'ArrowUp') {\r\n selectedIndex = (selectedIndex + currentProps.items.length - 1) % currentProps.items.length\r\n updatePopup()\r\n return true\r\n }\r\n\r\n if (props.event.key === 'ArrowDown') {\r\n selectedIndex = (selectedIndex + 1) % currentProps.items.length\r\n updatePopup()\r\n return true\r\n }\r\n\r\n if (props.event.key === 'Enter') {\r\n selectItem()\r\n return true\r\n }\r\n\r\n return false\r\n },\r\n onUpdate(props: any) { \r\n currentProps = props;\r\n updatePopup();\r\n },\r\n onExit() { popup.remove(); },\r\n }\r\n\r\n function updatePopup() {\r\n if (!currentProps.clientRect)\r\n return\r\n\r\n popup.innerHTML = '';\r\n\r\n currentProps.items.forEach((item: { id: string, description: string }, index: number) => {\r\n const button = document.createElement('button')\r\n\r\n button.textContent = item.description\r\n\r\n if (index === selectedIndex)\r\n button.classList.add('is-selected')\r\n\r\n button.addEventListener('click', () => {\r\n selectedIndex = index\r\n selectItem()\r\n })\r\n\r\n popup.appendChild(button)\r\n });\r\n\r\n const rect = currentProps.clientRect();\r\n popup.style.position = 'fixed'\r\n popup.style.left = `${rect.left}px`\r\n popup.style.top = `${rect.bottom + 5}px`\r\n }\r\n\r\n function selectItem() {\r\n const item = currentProps.items[selectedIndex]\r\n\r\n if (item)\r\n currentProps.command({ id: item.id, description: item.description, });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Suggestion;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst FontSize = Extension.create({\r\n name: 'fontSize',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['textStyle'],\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: element => {\r\n const size = element.style.fontSize;\r\n if (!size) return null;\r\n // normalize pt → px\r\n if (size.endsWith('pt'))\r\n return `${Math.round(parseFloat(size) * 1.333)}px`;\r\n return size;\r\n },\r\n renderHTML: attributes => {\r\n if (!attributes.fontSize) return {};\r\n\r\n return { style: `font-size: ${attributes.fontSize}` }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setFontSize: (fontSize: string) => ({ chain }) => { return chain().setMark('textStyle', { fontSize }).run() },\r\n unsetFontSize: () => ({ chain }) => { return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run() },\r\n }\r\n },\r\n})\r\n\r\nexport default FontSize;","import { CommonModule } from \"@angular/common\";\r\nimport { booleanAttribute, Component, ElementRef, EventEmitter, forwardRef, HostListener, input, Output, signal, viewChild, ViewEncapsulation } from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from \"@angular/forms\";\r\n\r\nimport { Editor } from '@tiptap/core'\r\nimport { Markdown } from '@tiptap/markdown'\r\nimport { StarterKit } from '@tiptap/starter-kit'\r\nimport { TextStyle } from '@tiptap/extension-text-style'\r\nimport { Color } from '@tiptap/extension-color'\r\nimport { Table } from '@tiptap/extension-table'\r\nimport { TableRow } from '@tiptap/extension-table-row'\r\nimport { TableCell } from '@tiptap/extension-table-cell'\r\nimport { TableHeader } from '@tiptap/extension-table-header'\r\nimport { TextAlign } from '@tiptap/extension-text-align'\r\n\r\nimport { CustomMention, mymarked } from \"./extensions/CustomMention\";\r\nimport CustomImageWithView from \"./extensions/CustomeImageWithView\";\r\nimport FontFamily from \"./extensions/FontFamily\";\r\nimport LineHeight from \"./extensions/LineHeight\";\r\nimport Suggestion from \"./extensions/Suggestion\";\r\nimport FontSize from \"./extensions/FontSize\";\r\n\r\n@Component({\r\n selector: \"es-editor\",\r\n templateUrl: \"./editor.component.html\",\r\n styleUrls: [\"./editor.component.scss\"],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => EditorComponent), multi: true },\r\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => EditorComponent), multi: true }\r\n ]\r\n})\r\nexport class EditorComponent implements ControlValueAccessor, Validator {\r\n\r\n protected onChange = (_: any) => { };\r\n public onTouched = () => { };\r\n public registerOnChange(fn: any): void { this.onChange = fn; }\r\n public registerOnTouched(fn: any): void { this.onTouched = fn; }\r\n\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n return null;\r\n }\r\n\r\n private element = viewChild.required<ElementRef<HTMLDivElement>>(\"element\");\r\n\r\n public EmojiSupport = input<boolean>(false);\r\n public BulletListSupport = input<boolean>(false);\r\n public TablesSupport = input<boolean>(false);\r\n public Mode = input.required<'html' | 'markdown' | 'text'>();\r\n public readonly = input(false, { transform: booleanAttribute });\r\n public disabled = input(false, { transform: booleanAttribute });\r\n public required = input(false, { transform: booleanAttribute });\r\n public style = input(\"\");\r\n\r\n public MentionEntities = input<{ id: string, description: string }[]>([]);\r\n\r\n public name = input.required<string>();\r\n\r\n private EditorRef?: Editor;\r\n public value: any;\r\n\r\n // Font disponibili nella toolbar (solo html): font \"web safe\", perché il valore viene visualizzato anche fuori dall'editor\r\n public readonly FontFamilies: { label: string, value: string }[] = [\r\n { label: \"Arial\", value: \"Arial, Helvetica, sans-serif\" },\r\n { label: \"Verdana\", value: \"Verdana, Geneva, sans-serif\" },\r\n { label: \"Tahoma\", value: \"Tahoma, Geneva, sans-serif\" },\r\n { label: \"Trebuchet MS\", value: \"'Trebuchet MS', Helvetica, sans-serif\" },\r\n { label: \"Georgia\", value: \"Georgia, serif\" },\r\n { label: \"Times New Roman\", value: \"'Times New Roman', Times, serif\" },\r\n { label: \"Courier New\", value: \"'Courier New', Courier, monospace\" },\r\n ];\r\n public readonly FontSizes: string[] = [\"10px\", \"12px\", \"14px\", \"16px\", \"18px\", \"20px\", \"24px\", \"28px\", \"32px\"];\r\n\r\n // Stato della selezione corrente, per evidenziare/abilitare i comandi della toolbar. Aggiornato a ogni transazione\r\n public Toolbar = signal<ToolbarState>(EMPTY_TOOLBAR_STATE);\r\n\r\n // Menu delle tabelle: menu custom e non <select>, perché su alcuni browser la select nativa usata come menu\r\n // di azioni non permetteva di scegliere le voci. Posizione fixed calcolata dal pulsante: .editor-shell ha\r\n // overflow hidden e taglierebbe un menu posizionato in absolute. null = chiuso\r\n public TableMenu = signal<{ top: number, left: number } | null>(null);\r\n private tableMenuRef = viewChild<ElementRef<HTMLElement>>(\"tableMenu\");\r\n\r\n @Output() inputChange: EventEmitter<string> = new EventEmitter<string>();\r\n @Output() inputFocus: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() inputFinalized: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n ngOnInit() {\r\n let config = [];\r\n\r\n config.push(...[\r\n StarterKit,\r\n TextStyle,\r\n Color,\r\n FontSize,\r\n FontFamily,\r\n LineHeight,\r\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\r\n CustomImageWithView\r\n ]);\r\n\r\n if (this.Mode() == \"markdown\")\r\n config.push(Markdown.configure({ marked: mymarked }));\r\n\r\n if (this.Mode() == \"html\") {\r\n if (this.TablesSupport())\r\n config.push(...[Table.configure({ lastColumnResizable: true, resizable: true }), TableRow, TableHeader, TableCell]);\r\n }\r\n\r\n if ((this.MentionEntities()?.length || 0) > 0)\r\n config.push(CustomMention.configure({\r\n deleteTriggerWithBackspace: true,\r\n HTMLAttributes: { class: 'mention' },\r\n renderText({ options, node }) { return `${options.suggestion.char}${node.attrs.description ?? node.attrs.id}` },\r\n suggestion: Suggestion(this.MentionEntities()),\r\n }),);\r\n\r\n this.EditorRef = new Editor({\r\n element: this.element().nativeElement,\r\n extensions: config,\r\n editable: !this.readonly(),\r\n onBlur: () => this.onTouched(),\r\n onTransaction: () => this.updateToolbarState(),\r\n onUpdate: (_) => {\r\n let value = \"\";\r\n switch (this.Mode()) {\r\n case \"html\":\r\n value = this.EditorRef?.getHTML() || \"\";\r\n // Emissione del valore vuoto trimmato per bene\r\n if (value.trim() === \"<p></p>\")\r\n value = \"\";\r\n break;\r\n case \"markdown\": value = this.EditorRef?.getMarkdown() || \"\"; break;\r\n case \"text\": value = this.EditorRef?.getText() || \"\"; break;\r\n }\r\n\r\n this.onChange(value);\r\n }\r\n });\r\n }\r\n\r\n public async writeValue(obj: any): Promise<void> {\r\n // Coercizione di tutti i valori \"vuoti\" all'unico \"null\"\r\n if (obj === null || obj === undefined) obj = null;\r\n\r\n this.value = obj;\r\n\r\n // normalizzazione per la firma di merda di CEA\r\n this.value = this.value?.replace(/^\\*\\*\\*\\*\\*\\*\\s\\s/g, '') || \"\"\r\n this.value = this.value?.replace(/^\\*\\*\\s\\s/g, '') || \"\"\r\n\r\n // Il caricamento di un valore non è una modifica dell'utente: niente evento di update,\r\n // quindi niente onChange e il controllo resta pristine\r\n if (this.Mode() === \"markdown\")\r\n this.EditorRef?.commands.setContent(this.value, { contentType: \"markdown\", emitUpdate: false });\r\n else if (this.Mode() === \"html\")\r\n this.EditorRef?.commands.setContent(this.value, { contentType: \"html\", emitUpdate: false });\r\n else\r\n this.EditorRef?.chain().setMeta(\"preventUpdate\", true).clearContent(false).insertContent(this.value).run();\r\n }\r\n\r\n private updateToolbarState() {\r\n const editor = this.EditorRef;\r\n if (!editor) return;\r\n\r\n const attrs = editor.getAttributes(\"textStyle\");\r\n const level = [1, 2, 3, 4, 5, 6].find(l => editor.isActive(\"heading\", { level: l }));\r\n\r\n this.Toolbar.set({\r\n block: level ? `h${level}` : \"paragraph\",\r\n // \"\" = predefinito, misto o non in elenco\r\n fontFamily: this.FontFamilies.find(f => sameFontFamily(f.value, attrs[\"fontFamily\"]))?.value || \"\",\r\n fontSize: this.FontSizes.find(s => s === attrs[\"fontSize\"]) || \"\",\r\n bold: editor.isActive(\"bold\"),\r\n italic: editor.isActive(\"italic\"),\r\n underline: editor.isActive(\"underline\"),\r\n bulletList: editor.isActive(\"bulletList\"),\r\n inTable: this.TablesSupport() && editor.can().deleteTable(),\r\n canUndo: editor.can().undo(),\r\n canRedo: editor.can().redo(),\r\n });\r\n }\r\n\r\n setFontFamily(selectElement: Event) {\r\n const value = (selectElement.target as HTMLSelectElement).value;\r\n if (value) this.EditorRef?.chain().focus().setFontFamily(value).run();\r\n else this.EditorRef?.chain().focus().unsetFontFamily().run();\r\n }\r\n setFontSize(selectElement: Event) {\r\n const value = (selectElement.target as HTMLSelectElement).value;\r\n if (value) this.EditorRef?.chain().focus().setFontSize(value).run();\r\n else this.EditorRef?.chain().focus().unsetFontSize().run();\r\n }\r\n\r\n setTypography(selectElement: Event) {\r\n const select = selectElement.target as HTMLSelectElement\r\n switch (select.value) {\r\n case \"paragraph\": this.EditorRef?.chain().focus().setParagraph().run(); break;\r\n default: this.EditorRef?.chain().focus().setHeading({ level: parseInt(select.value.charAt(1)) as any }).run(); break;\r\n }\r\n }\r\n setBold() {\r\n this.EditorRef?.chain().focus().toggleBold().run();\r\n }\r\n setItalic() {\r\n this.EditorRef?.chain().focus().toggleItalic().run();\r\n }\r\n setUnderlined() {\r\n this.EditorRef?.chain().focus().toggleUnderline().run();\r\n }\r\n setBulletList() {\r\n this.EditorRef?.chain().focus().toggleBulletList().run();\r\n }\r\n undoAction() {\r\n this.EditorRef?.chain().focus().undo().run();\r\n }\r\n redoAction() {\r\n this.EditorRef?.chain().focus().redo().run();\r\n }\r\n addTable() {\r\n this.EditorRef?.chain().focus().insertTable({ rows: 1, cols: 2, withHeaderRow: false }).run()\r\n }\r\n deleteTable() {\r\n this.EditorRef?.chain().focus().deleteTable().run();\r\n }\r\n addRow() {\r\n this.EditorRef?.chain().focus().addRowAfter().run();\r\n }\r\n deleteRow() {\r\n this.EditorRef?.chain().focus().deleteRow().run();\r\n }\r\n addColumn() {\r\n this.EditorRef?.chain().focus().addColumnAfter().run();\r\n }\r\n deleteColumn() {\r\n this.EditorRef?.chain().focus().deleteColumn().run();\r\n }\r\n toggleTableMenu(button: HTMLElement) {\r\n if (this.TableMenu()) {\r\n this.closeTableMenu();\r\n return;\r\n }\r\n this.tableMenuButton = button;\r\n this.positionTableMenu();\r\n // Il menu segue il pulsante: scroll in capture per intercettare anche i contenitori scrollabili, non solo la pagina\r\n window.addEventListener(\"scroll\", this.positionTableMenu, true);\r\n window.addEventListener(\"resize\", this.positionTableMenu);\r\n }\r\n private tableMenuButton?: HTMLElement;\r\n private readonly positionTableMenu = () => {\r\n const rect = this.tableMenuButton?.getBoundingClientRect();\r\n if (rect)\r\n this.TableMenu.set({ top: rect.bottom + 4, left: rect.left });\r\n }\r\n tableAction(action: \"insert\" | \"addRow\" | \"deleteRow\" | \"addColumn\" | \"deleteColumn\" | \"delete\") {\r\n this.closeTableMenu();\r\n switch (action) {\r\n case \"insert\": this.addTable(); break;\r\n case \"addRow\": this.addRow(); break;\r\n case \"deleteRow\": this.deleteRow(); break;\r\n case \"addColumn\": this.addColumn(); break;\r\n case \"deleteColumn\": this.deleteColumn(); break;\r\n case \"delete\": this.deleteTable(); break;\r\n }\r\n }\r\n\r\n // Chiusura del menu tabelle: click fuori o Esc\r\n @HostListener(\"document:mousedown\", [\"$event\"])\r\n onDocumentMouseDown(event: MouseEvent) {\r\n if (this.TableMenu() && !this.tableMenuRef()?.nativeElement.contains(event.target as Node))\r\n this.closeTableMenu();\r\n }\r\n @HostListener(\"document:keydown.escape\")\r\n closeTableMenu() {\r\n if (!this.TableMenu()) return;\r\n this.TableMenu.set(null);\r\n window.removeEventListener(\"scroll\", this.positionTableMenu, true);\r\n window.removeEventListener(\"resize\", this.positionTableMenu);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.closeTableMenu();\r\n }\r\n setEmoji(selectElement: Event) {\r\n const select = selectElement.target as HTMLSelectElement;\r\n this.EditorRef?.chain().focus().insertContent(select.value).run();\r\n select.value = \"\";\r\n }\r\n}\r\n\r\ninterface ToolbarState {\r\n block: string;\r\n fontFamily: string;\r\n fontSize: string;\r\n bold: boolean;\r\n italic: boolean;\r\n underline: boolean;\r\n bulletList: boolean;\r\n inTable: boolean;\r\n canUndo: boolean;\r\n canRedo: boolean;\r\n}\r\n\r\nconst EMPTY_TOOLBAR_STATE: ToolbarState = {\r\n block: \"paragraph\", fontFamily: \"\", fontSize: \"\",\r\n bold: false, italic: false, underline: false, bulletList: false,\r\n inTable: false, canUndo: false, canRedo: false,\r\n};\r\n\r\n// Confronta due font-family sul primo font dell'elenco: il browser riscrive le virgolette\r\n// in fase di parsing ('Times New Roman' -> \"Times New Roman\"), quindi le stringhe intere non coincidono\r\nfunction sameFontFamily(a?: string | null, b?: string | null): boolean {\r\n const first = (f?: string | null) => (f || \"\").split(\",\")[0].trim().replace(/^['\"]|['\"]$/g, \"\").toLowerCase();\r\n return !!first(a) && first(a) === first(b);\r\n}\r\n","<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <!-- (mousedown) preventDefault sui pulsanti: il click non toglie il focus all'editor, quindi la selezione resta visibile -->\r\n <div class=\"editor-toolbar\" role=\"toolbar\" aria-label=\"Formattazione\">\r\n\r\n <!-- Typography -->\r\n <select class=\"heading-select\" title=\"Stile del paragrafo\" (change)=\"setTypography($event)\">\r\n <option value=\"paragraph\" [selected]=\"Toolbar().block == 'paragraph'\">Paragrafo</option>\r\n <option value=\"h1\" [selected]=\"Toolbar().block == 'h1'\">Intestazione 1</option>\r\n <option value=\"h2\" [selected]=\"Toolbar().block == 'h2'\">Intestazione 2</option>\r\n <option value=\"h3\" [selected]=\"Toolbar().block == 'h3'\">Intestazione 3</option>\r\n <option value=\"h4\" [selected]=\"Toolbar().block == 'h4'\">Intestazione 4</option>\r\n <option value=\"h5\" [selected]=\"Toolbar().block == 'h5'\">Intestazione 5</option>\r\n <option value=\"h6\" [selected]=\"Toolbar().block == 'h6'\">Intestazione 6</option>\r\n </select>\r\n\r\n <!-- Font: solo html, il markdown non ha una sintassi per rappresentarli -->\r\n @if(Mode() == \"html\"){\r\n <select class=\"font-family-select\" title=\"Carattere\" (change)=\"setFontFamily($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontFamily == ''\">Carattere</option>\r\n @for(f of FontFamilies; track f.value){\r\n <option [value]=\"f.value\" [selected]=\"Toolbar().fontFamily == f.value\" [style.font-family]=\"f.value\">{{ f.label }}</option>\r\n }\r\n </select>\r\n <select class=\"font-size-select\" title=\"Dimensione\" (change)=\"setFontSize($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontSize == ''\">Dimensione</option>\r\n @for(s of FontSizes; track s){\r\n <option [value]=\"s\" [selected]=\"Toolbar().fontSize == s\">{{ s }}</option>\r\n }\r\n </select>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Grassetto\" aria-label=\"Grassetto\" [class.is-active]=\"Toolbar().bold\" [attr.aria-pressed]=\"Toolbar().bold\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBold()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Corsivo\" aria-label=\"Corsivo\" [class.is-active]=\"Toolbar().italic\" [attr.aria-pressed]=\"Toolbar().italic\" (mousedown)=\"$event.preventDefault()\" (click)=\"setItalic()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M19 4h-9M14 20H5M15 4 9 20\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Sottolineato\" aria-label=\"Sottolineato\" [class.is-active]=\"Toolbar().underline\" [attr.aria-pressed]=\"Toolbar().underline\" (mousedown)=\"$event.preventDefault()\" (click)=\"setUnderlined()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 4v6a6 6 0 0 0 12 0V4M4 20h16\" /></svg>\r\n </button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" class=\"tb-btn\" title=\"Elenco puntato\" aria-label=\"Elenco puntato\" [class.is-active]=\"Toolbar().bulletList\" [attr.aria-pressed]=\"Toolbar().bulletList\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBulletList()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01\" /></svg>\r\n </button>\r\n }\r\n\r\n <!-- Tables: un unico menu, le voci che agiscono su una tabella esistente sono attive solo con il cursore al suo interno -->\r\n @if(Mode() == \"html\" && TablesSupport()){\r\n <div class=\"divider\"></div>\r\n <div class=\"tb-dropdown\" #tableMenu>\r\n <button #tableMenuButton type=\"button\" class=\"tb-btn tb-btn-text\" title=\"Tabella\" aria-haspopup=\"menu\" [class.is-active]=\"!!TableMenu()\" [attr.aria-expanded]=\"!!TableMenu()\" (mousedown)=\"$event.preventDefault()\" (click)=\"toggleTableMenu(tableMenuButton)\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><path d=\"M3 9h18M3 15h18M12 3v18\" /></svg>\r\n <span>Tabella</span>\r\n <svg class=\"chevron\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\" /></svg>\r\n </button>\r\n @if(TableMenu(); as pos){\r\n <div class=\"tb-dropdown-menu\" role=\"menu\" [style.top.px]=\"pos.top\" [style.left.px]=\"pos.left\">\r\n <button type=\"button\" role=\"menuitem\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('insert')\">Inserisci tabella</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addRow')\">Aggiungi riga sotto</button>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addColumn')\">Aggiungi colonna a destra</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteRow')\">Elimina riga</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteColumn')\">Elimina colonna</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('delete')\">Elimina tabella</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- History -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Annulla\" aria-label=\"Annulla\" [disabled]=\"!Toolbar().canUndo\" (mousedown)=\"$event.preventDefault()\" (click)=\"undoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 14 4 9l5-5\" /><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Ripeti\" aria-label=\"Ripeti\" [disabled]=\"!Toolbar().canRedo\" (mousedown)=\"$event.preventDefault()\" (click)=\"redoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m15 14 5-5-5-5\" /><path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" /></svg>\r\n </button>\r\n\r\n @if(EmojiSupport()){\r\n <select class=\"emoji-select\" title=\"Emoji\" aria-label=\"Emoji\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>😊</option>\r\n <option value=\"😊\">😊</option>\r\n <option value=\"😀\">😀</option>\r\n <option value=\"😂\">😂</option>\r\n <option value=\"🔥\">🔥</option>\r\n <option value=\"🎉\">🎉</option>\r\n <option value=\"🚀\">🚀</option>\r\n <option value=\"❤️\">❤️</option>\r\n <option value=\"👍\">👍</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>\r\n","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const TXE_DEBUG = new InjectionToken<boolean>('TXE_DEBUG');","/*\r\n * Public API Surface of text-editors\r\n */\r\n\r\nexport * from './lib/editor/editor.component';\r\n\r\nexport * from \"./lib/tokens\"","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -24,11 +24,25 @@ declare class EditorComponent implements ControlValueAccessor, Validator {
24
24
  name: _angular_core.InputSignal<string>;
25
25
  private EditorRef?;
26
26
  value: any;
27
+ readonly FontFamilies: {
28
+ label: string;
29
+ value: string;
30
+ }[];
31
+ readonly FontSizes: string[];
32
+ Toolbar: _angular_core.WritableSignal<ToolbarState>;
33
+ TableMenu: _angular_core.WritableSignal<{
34
+ top: number;
35
+ left: number;
36
+ }>;
37
+ private tableMenuRef;
27
38
  inputChange: EventEmitter<string>;
28
39
  inputFocus: EventEmitter<any>;
29
40
  inputFinalized: EventEmitter<string>;
30
41
  ngOnInit(): void;
31
42
  writeValue(obj: any): Promise<void>;
43
+ private updateToolbarState;
44
+ setFontFamily(selectElement: Event): void;
45
+ setFontSize(selectElement: Event): void;
32
46
  setTypography(selectElement: Event): void;
33
47
  setBold(): void;
34
48
  setItalic(): void;
@@ -42,10 +56,29 @@ declare class EditorComponent implements ControlValueAccessor, Validator {
42
56
  deleteRow(): void;
43
57
  addColumn(): void;
44
58
  deleteColumn(): void;
59
+ toggleTableMenu(button: HTMLElement): void;
60
+ private tableMenuButton?;
61
+ private readonly positionTableMenu;
62
+ tableAction(action: "insert" | "addRow" | "deleteRow" | "addColumn" | "deleteColumn" | "delete"): void;
63
+ onDocumentMouseDown(event: MouseEvent): void;
64
+ closeTableMenu(): void;
65
+ ngOnDestroy(): void;
45
66
  setEmoji(selectElement: Event): void;
46
67
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditorComponent, never>;
47
68
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditorComponent, "es-editor", never, { "EmojiSupport": { "alias": "EmojiSupport"; "required": false; "isSignal": true; }; "BulletListSupport": { "alias": "BulletListSupport"; "required": false; "isSignal": true; }; "TablesSupport": { "alias": "TablesSupport"; "required": false; "isSignal": true; }; "Mode": { "alias": "Mode"; "required": true; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "style": { "alias": "style"; "required": false; "isSignal": true; }; "MentionEntities": { "alias": "MentionEntities"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": true; "isSignal": true; }; }, { "inputChange": "inputChange"; "inputFocus": "inputFocus"; "inputFinalized": "inputFinalized"; }, never, never, true, never>;
48
69
  }
70
+ interface ToolbarState {
71
+ block: string;
72
+ fontFamily: string;
73
+ fontSize: string;
74
+ bold: boolean;
75
+ italic: boolean;
76
+ underline: boolean;
77
+ bulletList: boolean;
78
+ inTable: boolean;
79
+ canUndo: boolean;
80
+ canRedo: boolean;
81
+ }
49
82
 
50
83
  declare const TXE_DEBUG: InjectionToken<boolean>;
51
84
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/text-editors",
3
- "version": "20.3.25",
3
+ "version": "20.3.27",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },